[英]conditional member function declaration based on variadic template length
我想根据类的可变参数模板的长度在类中定义一组不同的成员函数。 这可能吗? 例如这样的事情可能吗?
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...
的长度T2...
大于零,我要定义函数f1
而如果T2...
中没有参数T2...
我想定义一些函数f2
。 这可能吗?
基本思路:
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>
{ };
或者,您可以在S
同时包含f1
和f2
,然后通过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);
...
}
};
如果使成员函数基于应用于T2...
sizeof...()
模板化T2...
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上做了一个工作示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.