相关疑难解决方法(0)

如何使用可变参数模板参数enable_if一个类?

假设我有一个具有以下签名的类:

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模板一起使用

但尽管有这个名字,这个问题及其答案并没有多大帮助.如果有人可以提供或链接有关如何处理此问题的指南以及为什么会对此表示赞赏.

c++ templates

13
推荐指数
2
解决办法
5513
查看次数

使用enable_if检查参数包的类型

由于对允许的非类型可变参数模板有限制,我试图编写一个使用任意数量的双精度函数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?

c++ templates variadic-templates

12
推荐指数
2
解决办法
2307
查看次数

在参数中强制执行的单一类型的C++参数包

我希望能够做到以下几点:

#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)

以下答案并不令人满意:他们只想检查参数包是否为单一类型,但我想在参数中将值正确转换为它(否则它不起作用).

C++参数包,被限制为具有单一类型的实例?

参数包后具有非推导类型的参数

为使用数组,向量,结构等传递给variadic函数或可变参数模板函数的所有参数指定一种类型?

我也不能使用initializer_list,因为我无法计算传递给该array类型的参数数量.我特别不想打字foo(blah{}, blah{});.

我的可能性是什么?

c++ variadic-templates c++11 c++14 c++17

8
推荐指数
1
解决办法
775
查看次数

标签 统计

c++ ×3

templates ×2

variadic-templates ×2

c++11 ×1

c++14 ×1

c++17 ×1