c++ - 带类的标签分发

标签 c++ c++11 templates primitive-types

下面是一个标签分发的简单例子

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;
}

我想做一些类似但涉及类(class)的事情。有点像

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;
}

但是

  1. 我不知道如何分配到正确的类(class)
  2. 报表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>默认值由主模板确定,并选择其中一个特化

关于c++ - 带类的标签分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245365/

相关文章:

c++ - gcc 对 `std::random_device` 的实现是否正确?

c++ - 如何总结字符串中出现的字符的值,使它们成对并按升序排序?

c++ - 不能出现在常量表达式中

c++ - 具有空参数包的递归可变参数模板(以避免基本情况的重复)

c++ - "Template argument for template template parameter must be a class template or type alias template"

c++ - 为什么第一个函数调用绑定(bind)到第一个函数?

c++ - 创建简单的 qml 应用程序

c++ - gcc 的 __float128 float 是否考虑了当前的舍入模式?

c++ - 友元函数的模板编译

c++ - "template"消歧器是 c++11。 VS2008 编译器有机会吗?