使用 类 发送标签
Tag dispatch with classes
这是一个简单的标签分发示例
template <typename T>
void foo(T x, std::true_type)
{
std::cout << "A primitive type\n";
}
template <typename T>
void foo(T x, std::false_type)
{
std::cout << "Not a primitive type\n";
}
template <typename T>
void foo(T x) {
foo(x, std::is_fundamental<T>{});
}
int main()
{
int a = 3;
std::vector<int> v = {1,2,3};
foo(a);
foo(v);
return 0;
}
我想做一些类似但涉及 classes 的事情。像
template <typename T, std::true_type>
class C
{
public:
T x;
void foo()
{
std::cout << "A primitive type\n";
}
C(T i):x(i){};
};
template <typename T, std::false_type>
class C
{
public:
void foo()
{
std::cout << "Not a primitive type\n";
}
C(T i):x(i){};
};
int main()
{
int a = 3;
std::vector<int> v = {1,2,3};
C A(a);
C V(v);
A.foo();
V.foo();
return 0;
}
但是
- 不知道怎么调度到右边class
- 语句
template <typename T, std::true_type>
不编译(我直觉地理解为什么)。
我想我可能不得不使用多态性,但我没能解决这个问题。
您可以使用(部分)专业化。例如
template <typename T, typename flag = typename some_trait<T>::type>
class C;
template <typename T>
class C<T, std::true_type> { //implementation if trait is true };
template <typename T>
class C<T, std::false_type> { //implementation if trait is false };
如果你这样写 C<some_type>
默认值由主模板确定,并且选择其中一个专业
这是一个简单的标签分发示例
template <typename T>
void foo(T x, std::true_type)
{
std::cout << "A primitive type\n";
}
template <typename T>
void foo(T x, std::false_type)
{
std::cout << "Not a primitive type\n";
}
template <typename T>
void foo(T x) {
foo(x, std::is_fundamental<T>{});
}
int main()
{
int a = 3;
std::vector<int> v = {1,2,3};
foo(a);
foo(v);
return 0;
}
我想做一些类似但涉及 classes 的事情。像
template <typename T, std::true_type>
class C
{
public:
T x;
void foo()
{
std::cout << "A primitive type\n";
}
C(T i):x(i){};
};
template <typename T, std::false_type>
class C
{
public:
void foo()
{
std::cout << "Not a primitive type\n";
}
C(T i):x(i){};
};
int main()
{
int a = 3;
std::vector<int> v = {1,2,3};
C A(a);
C V(v);
A.foo();
V.foo();
return 0;
}
但是
- 不知道怎么调度到右边class
- 语句
template <typename T, std::true_type>
不编译(我直觉地理解为什么)。
我想我可能不得不使用多态性,但我没能解决这个问题。
您可以使用(部分)专业化。例如
template <typename T, typename flag = typename some_trait<T>::type>
class C;
template <typename T>
class C<T, std::true_type> { //implementation if trait is true };
template <typename T>
class C<T, std::false_type> { //implementation if trait is false };
如果你这样写 C<some_type>
默认值由主模板确定,并且选择其中一个专业