这是标签分发的简单示例

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

我想做类似的事情,但要涉及到类。就像是
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;
}


  • 我不知道如何调度到正确的类
  • 语句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++ - 带类的标签分派(dispatch),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48245365/

    10-09 09:11