假设我有一个带有整数模板参数的类。我如何添加一个获取给定类型的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
// ...
答案 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 */ }
};
对于c ++ 11,您需要实现integer_sequence
才能使其正常工作......可以像this