相关疑难解决方法(0)

Variadic模板包扩展

我正在尝试学习可变参数模板和函数.我无法理解为什么这段代码不能编译:

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

当我编译它失败时出现错误:

错误C3520:'args':必须在此上下文中扩展参数包

(在功能上foo2).

c++ templates variadic-templates c++11

69
推荐指数
4
解决办法
4万
查看次数

"if constexpr()"与"if()"之间的区别

if constexpr()和之间有什么区别if()

我何时何地可以同时使用它们?

c++ if-statement constexpr c++17

21
推荐指数
2
解决办法
5551
查看次数

如何扩展对可变参数模板基类的调用?

我有一组非正交的策略,它们都实现了一个通用的命名方法,策略添加了安全检查.我希望用户能够组合策略以允许更复杂的验证,而无需手动为每个组合案例创建策略.我的方法是创建一个新的策略类来组合其他人.

下面的简化示例将C显示为组合类,此处将方法ID组合在一起.当在C上调用id时,预期的结果是顺序调用每个基类的id.

#include <iostream>
using namespace std;

struct A 
{
    void id() { cout << "A ";}
};

struct B 
{
    void id() { cout << "B ";}
};

template<class A, class... As>
struct C : public A, public As... 
{
    void id()
    {
         A::id();
         As...::id(); // This line does not work, it is illustrative.
    }
};

int main()
{
    C<A, B> c;
    c.id();

    //expected: result A B 
}
Run Code Online (Sandbox Code Playgroud)

问题是:是否有可能扩展为...以某种方式这样做而不使用递归方法,只使用...运算符?

c++ templates metaprogramming variadic-templates c++11

14
推荐指数
1
解决办法
999
查看次数