0

作为 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);
}
4

1 回答 1

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&&)intdoublecharint x = 2.0, y = 'a';

于 2013-01-08T03:43:42.787 回答