如何解决是否可以在另一个模板类上专门化模板类的方法?
我有一个类 A
,它是一个模板,如果该类是具有 foo()
泛型的 std::vector<T>
,我想专门化方法 T
,我得到错误:无效使用不完整的类型。我想避免为所有可能的向量编写所有特化。
#include <iostream>
#include <vector>
template<typename V>
struct A {
void foo() {
std::cout << "A<V>\n";
}
};
template<typename T>
void A<std::vector<T>>::foo() {
std::cout << "A<V<T>>\n";
}
int main() {
C<int> a;
C<std::vector<int>> b;
return 0;
}
解决方法
如果 foo()
不依赖于 A
的其他元素,您可以通过基类继承它并特化基类。
我的意思如下
template <typename>
struct Base
{ void foo() { std::cout << "A<V>\n"; } };
template <typename ... Ts>
struct Base<std::vector<Ts...>>
{ void foo() { std::cout << "A<V<Ts...>>\n"; } };
template <typename T>
struct A : public Base<T>
{ };
另一种可能的解决方案是标签调度:根据需要开发两个 foo()
函数并“启用”正确的函数。
例如
template <typename>
struct is_vector : public std::false_type
{ };
template <typename ... Ts>
struct is_vector<std::vector<Ts...>> : public std::true_type
{ };
template <typename T>
struct A
{
void foo (std::true_type) { std::cout << "A<V<Ts...>>\n"; }
void foo (std::false_type) { std::cout << "A<V>\n"; }
void foo () { foo(is_vector<T>{}); }
};
,
仅使用 c++20 contrians:
template <typename V>
struct A {
void foo() { std::cout << "A<V>\n"; }
void foo() requires (std::same_as<V,std::vector<typename V::value_type>>) {
std::cout << "A<V<T>>\n";
}
};
然后这有效:
A<int>{}.foo(); // call normal one
A<std::vector<int>>{}.foo(); // call specialized one
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。