函数参数的数量等于模板整数

时间:2016-11-24 19:09:14

标签: c++ templates

假设我有一个带有整数模板参数的类。我如何添加一个获取给定类型的N参数的函数?如果可能的话,我想避免使用enable_if等。

我目前所做的是:

template<unsigned int N>
class Foo
{
    template <typename To, typename>
    using to = To;
public:
    template<typename... Args>
    void Bar(to<char, Args>... args) // Some arguments of type char
    { /* do stuff */ }
};

这允许调用Bar:

Foo<3> myfoo;
myfoo.Bar<int, int, int>('a', 'b', 'c');

然而,我看到两个缺点。首先,参数的数量不一定限于N,除了Bar内的代码。

其次,用户需要向该功能添加模板参数。它们的值实际上并未使用,只有参数的数量。这似乎是不必要的,因为我们已经有了这个,即N

该功能的最佳使用方式如下:

Foo<3> myfoo;
myfoo.Bar('a', 'b', 'c'); // valid

以下调用会生成编译错误。 function does not take this many arguments,或者您将获得的类似标准编译错误,就像您手动定义void(char, char, char)一样。

myfoo.Bar('a', 'b');
myfoo.Bar('a', 'b', 'c', 'd'); // error
myfoo.Bar('a', 'b', "flob"); // error
// ...

1 个答案:

答案 0 :(得分:3)

如果你使用的是c ++ 14,你可以这样做:

#include <utility>

template<std::size_t N, class = std::make_index_sequence<N>>
class Foo;

template<std::size_t N, std::size_t... Is>
class Foo<N, std::index_sequence<Is...>>{
    void Bar(decltype(Is, char{})... args) // Some arguments of type char
    { /* do stuff */ }
};

[live demo]

对于c ++ 11,您需要实现integer_sequence才能使其正常工作......可以像this

那样完成