0

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);
}
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...); }

また、3 つの引数すべてに対してh(int, T&)オーバーロードが呼び出され、 、および、これは私には非常に疑わしいように見えます (または、これも機能するためですか?)h(int, int&&)intdoublecharint x = 2.0, y = 'a';

于 2013-01-08T03:43:42.787 に答える