假设我有一个具有以下签名的类:
template <typename T, typename... Args>
class A;
Run Code Online (Sandbox Code Playgroud)
但是这个类的行为应该取决于其他一些参数,让我们说它的值是T::value
:
template <typename T, typename... Args, typename Enable>
class A;
template <typename T, typename... Args, typename = typename std::enable_if<T::value>::type>
class A
{
// do something
};
template <typename T, typename... Args, typename = typename std::enable_if<!T::value>::type>
class A
{
// do something else
};
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
但是,此程序会出现以下错误:
prog.cpp:6:11:错误:参数包'Args'必须位于模板参数列表类A的末尾;
我一直在努力寻找有关使用enable_if
可变参数模板选择类的信息的良好信息来源.我能找到的唯一问题就是这个问题:
如何将std :: enable_if与variadic模板一起使用
但尽管有这个名字,这个问题及其答案并没有多大帮助.如果有人可以提供或链接有关如何处理此问题的指南以及为什么会对此表示赞赏.
由于对允许的非类型可变参数模板有限制,我试图编写一个使用任意数量的双精度函数enable_if
.从本质上讲,我想做的事情如下:
template<typename... T,
typename = typename std::enable_if<std::is_convertible<T, double>::value, T>::type>
foo(T... t){ /* code here */ }
Run Code Online (Sandbox Code Playgroud)
我选择将其enable_if
作为未命名参数的默认值,因为我的函数实际上是一个构造函数,并且没有返回值.这适用于单个参数,但由于变量模板T
是参数包,因此上述代码无效.那么,我如何检查每个参数是否可以转换为double?
我希望能够做到以下几点:
#include <array>
struct blah { };
template<typename... Args>
constexpr auto foo(Args&&... args)
{
return std::array<blah, sizeof...(Args)>{{ args... }};
}
auto res = foo({}, {});
Run Code Online (Sandbox Code Playgroud)
以下答案并不令人满意:他们只想检查参数包是否为单一类型,但我想在参数中将值正确转换为它(否则它不起作用).
为使用数组,向量,结构等传递给variadic函数或可变参数模板函数的所有参数指定一种类型?
我也不能使用initializer_list,因为我无法计算传递给该array
类型的参数数量.我特别不想打字foo(blah{}, blah{});
.
我的可能性是什么?