template <unsigned int N> class myclass
{
public:
template <typename... Args> void mymethod(Args... args)
{
// Do interesting stuff
}
};
I want mymethod
仅当恰好有 N 个双打时才被调用。那可能吗?也就是说,假设我有:
myclass <3> x;
x.mymethod(3., 4., 5.); // This works
x.mymethod('q', 1., 7.); // This doesn't work
x.mymethod(1., 2.); // This doesn't work
我怎样才能完成这件事?
对于参数数量约束,您可以轻松检查是否sizeof...(Args) == N
但是为了检查所有参数是否都是双精度数,您需要构建一个递归类型特征来检查std::is_same
对于每个参数。
template<typename...>
struct are_same : std::true_type
{};
template<typename T>
struct are_same<T> : std::true_type
{};
template<typename T, typename U, typename... Types>
struct are_same<T, U, Types...> :
std::integral_constant<bool, (std::is_same<T, U>::value && are_same<T, Types...>::value)>
{};
Notice are_same
首先声明然后专门.
然后只需使用以下方法在方法返回类型中实现约束std::enable_if
通过利用SFINAE http://en.cppreference.com/w/cpp/language/sfinae.
template <unsigned int N> class myclass
{
public:
template <typename... Args>
typename std::enable_if<(are_same<double, Args...>::value && sizeof...(Args) == N), void>::type
/* void */ mymethod(Args... args)
{
// Do interesting stuff
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)