作为OpenCL绑定的DSL的一部分,我必须计算赋予函数f
的参数并单独处理它们,在下面的代码中这将是h
。该函数应该接受LValues以及大多数类型的RValues。但是,对于某些类型(此处:int
),只有LValue引用是可接受的(在实际代码中,这些是可能需要延迟初始化的对象)。
我的问题:如何摆脱const_cast
? f(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);
}
答案 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&&)
,int
和double
都会调用重载char
,这对我来说非常可疑(或者这是因为int x = 2.0, y = 'a';
也适用?)