可变模板方法接受给定数量的双精度数?

Mat*_*nti 13 c++ templates variadic variadic-templates

template <unsigned int N> class myclass
{
public:
    template <typename... Args> void mymethod(Args... args)
    {
       // Do interesting stuff
    } 
};
Run Code Online (Sandbox Code Playgroud)

我希望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
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

Den*_*rim 17

对于参数约束的数量,您可以轻松检查是否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)>
{};
Run Code Online (Sandbox Code Playgroud)

通知are_same首先声明然后专门.

然后std::enable_if通过利用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
    } 
};
Run Code Online (Sandbox Code Playgroud)