0

次のコードがあります。

template <typename T> LuaCall& operator>>(T) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
template <> LuaCall& operator>><int&>(int& val) { mResults.push_back(std::make_pair(LUA_RESULT_INTEGER, (void *)&val)); return *this; }
template <> LuaCall& operator>><float&>(float& val) { mResults.push_back(std::make_pair(LUA_RESULT_FLOAT, (void *)&val)); return *this; }
template <> LuaCall& operator>><double&>(double& val) { mResults.push_back(std::make_pair(LUA_RESULT_DOUBLE, (void *)&val)); return *this; }
template <> LuaCall& operator>><bool&>(bool& val) { mResults.push_back(std::make_pair(LUA_RESULT_BOOLEAN, (void *)&val)); return *this; }
template <> LuaCall& operator>><std::string&>(std::string& val) { mResults.push_back(std::make_pair(LUA_RESULT_STRING, (void *)&val)); return *this; }
template <> LuaCall& operator>><LuaNilStruct>(LuaNilStruct) { mResults.push_back(std::make_pair(LUA_RESULT_NIL, (void *)NULL)); return *this; }

その後:

int abc;
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333 >> abc;

cin >> のように動作するようにしたい。つまり、lua 関数の戻り値を abc に書き込む必要がある。だから私はそのアドレスが必要です..しかし、それはデフォルトのテンプレートでデフォルト設定されています。私は何を間違っていますか?cin がまさにそれを行うので、これを行う方法は確かにあります。

ありがとう!


% を >> に変更した人への注意: そのままなので元に戻しました :D コードは Lua 関数 test("test", 5, nil, 2.333) を呼び出し、その戻り値を abc に保存します。% は関数のパラメーター用、>> は戻り値用です。

template <typename T>
LuaCall& operator%(T val) {
    mLua->Push(val);
    ++mArguments;
    return *this;
}
4

3 に答える 3

2

operator>> を単項演算子として書きましたが、これは二項演算子です。LeftHandSide >> RightHandSide.

std::cout <"Hello" << " world";したがって、フォームは次のとおりです(operator<<(operator<<(std::cout, "Hello"), " world)。- 最初<<は、2 番目の左側として使用する std::cout を返します<<

本当の問題は、コード内でルックアップが次のように行われることです。

  1. 候補関数が決定されます (1 つの候補、テンプレートのみ)
  2. T が推定されます。
  3. インスタンス化する特殊化 (存在する場合) を決定します。

ステップ 2 では、T==int です。ステップ 3 では、特殊化がないT==intため、ベース テンプレートが選択されてインスタンス化されます。特殊化の代わりにオーバーロードを使用したい場合があります。オーバーロードはステップ 1 でより適切に一致するため、テンプレートの引数推定のポイントに到達することさえありません。

于 2009-10-27T12:20:39.120 に答える
1

"test" , 5 or 2.333参照が予想される場所では、定数値 ( ) を使用できません。この動作が必要な場合は、テンプレートとパラメーターの型operator>>を (int, floatなど) に変更します。

于 2009-10-27T12:21:24.670 に答える
0

1 つoperator>>は、二項演算子です。つまり、2 つの引数を取る必要があります。最初の引数は、の型である必要があります

LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333

その演算子はLuaCall&を返すので、それがその呼び出しの結果 (したがって左の引数) であると思います。

そのことから、mResultそのオペレーターをクラスメンバーとして実行しようとしていると思います。しかし、メンバー テンプレートを特殊化できるとは思いません。

最後に、参照型に特化する必要はないと思います。これ

template <> LuaCall& operator>><int>(int val);

すべき

于 2009-10-27T12:20:11.133 に答える