可变参数模板功能和参考类型

时间:2013-01-08 03:36:39

标签: c++ c++11

作为OpenCL绑定的DSL的一部分,我必须计算赋予函数f的参数并单独处理它们,在下面的代码中这将是h。该函数应该接受LValues以及大多数类型的RValues。但是,对于某些类型(此处:int),只有LValue引用是可接受的(在实际代码中,这些是可能需要延迟初始化的对象)。

我的问题:如何摆脱const_castf(T...)不起作用,f(T&...)f(T&&...)

也不起作用
template<typename T>
void h(int i, const T &x) {/* generic things */}

void h(int i, const int &x) { const_cast<int&>(x) = 123; }

template<int i> void g() {}

template<int i, typename H, typename... T>
void g(H &x, T... xs) {
    h(i, x);
    g<i + 1>(xs...);
}

template<typename... T>
void f(const T&... xs) { g<0u>(xs...); }

#include <cassert>
int main(int, char**) {
    int x = 1;
    f(x, 2.0 + 3.0, 'c');
    assert(x == 123);
}

1 个答案:

答案 0 :(得分:0)

在撰写问题时,我找到了一个解决方案,但我不明白为什么签名是int &&而不是int &(虽然看起来不重要?)

template<typename T>
void h(int i, T x) {cerr << i << "=" << x << endl;}

void h(int i, int &&x) {
    x = 123;
    cerr << i << "=" << x << " (new)" << endl;
}

template<int i> void g() {}

template<int i, typename H, typename... T>
void g(H &&x, T &&... xs) {
    h(i, std::move(x));
    g<i + 1>(xs...);
}

template<typename... T>
void f(T &&... xs) { g<0u>(xs...); }

此外,对于h(int, T&),所有三个参数h(int, int&&)intdouble都会调用重载char,这对我来说非常可疑(或者这是因为int x = 2.0, y = 'a';也适用?)