< int&>を使用したC ++テンプレートの特殊化intを拾わない
-
06-07-2019 - |
質問
次のコードがあります:
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&gt;&gt;のように動作するようにしたいつまり、abcにlua関数の戻り値を書き込む必要があります。そのため、アドレスが必要です。しかし、デフォルトのテンプレートがデフォルトになります。何が間違っていますか? cinがまさにそれを行うので、これを行う方法は確かにあります。
ありがとう!
%を&gt;&gt;に変更した人への注意:元の状態に戻ったため、変更しました:DコードはLua関数test(&quot; test&quot ;, 5、nil、2.333)を呼び出して保存しますabcへの戻り値。 %は関数のパラメーター用、&gt;&gt;は戻り値用です。
template <typename T>
LuaCall& operator%(T val) {
mLua->Push(val);
++mArguments;
return *this;
}
解決
あなたが書いた演算子&gt;&gt;単項演算子としてですが、それは二項演算子です。 LeftHandSide&gt;&gt; RightHandSide
。
std :: cout&lt;&quot; Hello&quot;という形式&lt;&lt; &quot;したがって、world&quot ;;
は(operator&lt;&lt;(operator&lt;&lt;(std :: cout、&quot; Hello&quot;)、&quot; world)
;-最初の&lt ;&lt;
は、2番目の&lt;&lt;
の左側として使用するためにstd :: coutを返します。
実際の問題は、コード内でルックアップが次のように発生することです:
- 候補関数が決定されます(1つの候補、テンプレートのみ)
- Tは推定されます。
- インスタンス化するスペシャライゼーション(存在する場合)を決定します。
ステップ2で、T == int。ステップ3では、 T == int
に特化されていないため、ベーステンプレートが選択され、インスタンス化されます。特殊化の代わりにオーバーロードを使用することもできます。オーバーロードはステップ1でより適切に一致するため、テンプレート引数の推論のポイントに到達することすらありません
他のヒント
参照が予想される場所では、定数値(&quot; test&quot;、5または2.333
)を使用できません。この動作が必要な場合は、 operator&gt;&gt;
のテンプレートとパラメータータイプを( int、float
など)に変更します。
1つは、 operator&gt;&gt;
は binary 演算子です。つまり、2つの引数を取る必要があります。最初の引数は
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333
その演算子は LuaCall&amp;
を返すので、その呼び出しの結果(つまり左引数)が何であると思います。
その mResult
から、クラスメンバとしてその演算子を実行しようとしていると思います。しかし、メンバーテンプレートを専門化できるとは思いません。
最後に、参照型に特化する必要はないと思います。これ
template <> LuaCall& operator>><int>(int val);
すべき