我想根据类的可变参数模板的长度在类中定义一组不同的成员函数。这可能吗?例如这样的事情可能吗?
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
。这可能吗?
答案 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
中可以同时存在f2
和S
,然后通过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做了一个有效的例子