OpenCL バインディングの DSL の一部として、関数に与えられた引数をカウントし、f
それらを個別に処理する必要があります。以下のコードでは、h
. この関数は、ほとんどの型で左辺値と右辺値を受け入れる必要があります。ただし、一部の型 (ここでは: 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);
}