基于可变模板长度的条件成员函数声明

时间:2018-10-20 20:10:56

标签: c++ c++11 variadic-templates

我想根据类的可变参数模板的长度在类中定义一组不同的成员函数。这可能吗?例如这样的事情可能吗?

template<class T, std::size_t... T2>
class S {
   public:
      #ifdef SIZE_OF_T2_GREATER_THAN_ZERO
         void f1(params1);
      #else
         void f2(params2);
      #endif
};

因此,如果T2...的长度大于零,我要定义函数f1,而如果T2...中没有参数,我要定义一些函数f2。这可能吗?

2 个答案:

答案 0 :(得分:2)

基本思路:

template<std::size_t size_of_t2, class T>
struct Base
{ 
    void f1(params1);
};

template<class T>
struct Base<0, T>
{
    void f2(params2);
};

template<class T, std::size_t... T2>
struct S : Base<sizeof...(T2), T>
{ };

或者,f1中可以同时存在f2S,然后通过static_assert保护它们的使用(请注意,没有实例化类模板的成员函数除非使用了它们):

template<class T, std::size_t... T2>
struct S
{
    void f1(params1)
    { 
        static_assert(sizeof...(T2) > 0);
        ...
    }

    void f2(params2)
    { 
        static_assert(sizeof...(T2) == 0);
        ...
    }
};

答案 1 :(得分:2)

如果您将成员函数基于应用于T2...的{​​{1}}进行模板化

template<std::size_t L = sizeof...(T2)>

您可以使用std::enable_if有条件地编译函数,如下所示:

template<class T, std::size_t... T2>
struct my_struct{
    template<std::size_t L = sizeof...(T2)>
    typename std::enable_if<L!=0, void>::type f1()
    {
        std::cout<< "this class has T2...\n";
    }

    template<std::size_t L = sizeof...(T2)>
    typename std::enable_if<L==0, void>::type f2()
    {
        std::cout<< "this class has nooooo T2\n";
    }
};

我在http://cpp.sh/6jskq做了一个有效的例子