相关疑难解决方法(0)

为每个可变参数模板参数和数组调用函数

所以我有一些类型X:

typedef ... X;
Run Code Online (Sandbox Code Playgroud)

和模板功能f:

class <typename T>
void f(X& x_out, const T& arg_in);
Run Code Online (Sandbox Code Playgroud)

然后是一个功能g:

void g(const X* x_array, size_t x_array_size);
Run Code Online (Sandbox Code Playgroud)

我需要编写一个variadic模板函数h来执行此操作:

template<typename... Args>
void h(Args... args)
{
    constexpr size_t nargs = sizeof...(args); // get number of args
    X x_array[nargs]; // create X array of that size

    for (int i = 0; i < nargs; i++) // foreach arg
        f(x_array[i], args[i]); // call f (doesn't work)

    g(x_array, nargs); // call g with …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates c++11

25
推荐指数
3
解决办法
3万
查看次数

可变参数扩展可以用作逗号运算符调用链吗?

我在看“如何正确使用可变参数模板的引用”,并想知道逗号扩展可以走多远。

这是答案的一个变体:

inline void inc() { }

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t; inc(args...); }
Run Code Online (Sandbox Code Playgroud)

由于可变参数被扩展到一逗号-分隔它们的元素的列表,是那些逗号语义上等同于模板/功能参数的分离器,或者他们插入词法,使得它们适用于任何(-预处理后)的使用,包括逗号操作符?

这适用于我的 GCC-4.6:

// Use the same zero-argument "inc"

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, inc(args...); }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时:

// Use the same zero-argument "inc"

template<typename T,typename ...Args>
inline void inc(T& t, Args& ...args) { ++t, ++args...; }
Run Code Online (Sandbox Code Playgroud)

我不断收到解析错误,期待“;” 在“...”之前,并且“args”不会扩展其包。为什么不起作用?是因为如果“args”为空,我们会得到一个无效的标点符号?合法吗,我的编译器不够好?

(我试过在括号中围绕“args”,和/或使用后增量;都没有奏效。)

c++ variadic comma c++11

5
推荐指数
1
解决办法
1223
查看次数

标签 统计

c++ ×2

c++11 ×2

comma ×1

templates ×1

variadic ×1

variadic-templates ×1