を変更する関数ポインタを経由して可変引数関数に渡ささまざまなタイプの.cppファイルで、私はそのマップを初期化しています:、paramsが、私はいくつかの静的関数を持つクラスと、これらの関数へのポインタを含むマップを持って自分の価値
template <typename ... argsType>
static bool Call(std::string const& Key, argsType&& ... Args)
{
using prototype = bool(*)(argsType ...);
return reinterpret_cast<prototype>(m_FunctionMap.at(Key))(Args ...);
//return reinterpret_cast<prototype>(m_FunctionMap.at(Key))(std::forward<argsType>(Args) ...); // this has the same issue
}
今、私はこのコードを実行すると:
std::unordered_map<std::string, Conditions::cbType> const Conditions::m_FunctionMap
{
{ "Equal_int", MakeMapVal(&Equal_int) },
{ "Equal_float", MakeMapVal(&Equal_float) },
{ "Greater_int", MakeMapVal(&Greater_int) },
{ "Greater_float", MakeMapVal(&Greater_int) },
{ "Between_int", MakeMapVal(&Between_int) },
{ "Between_float", MakeMapVal(&Between_float) },
};
その後、私は自分の名前でこれらの静的関数を呼び出すために、クラスConditions
にメソッドを追加しましたそれぞれの静的機能を正しく呼び出すCall(std::string const& Key, argsType&& ... Args)
メソッドを呼び出します。例えば:
Call("Greater_int", 42, 40);
しかし、Greater_int()
関数内でそれらの2つのパラメータは、42と40、それ以上ではなく、いくつかのランダムな値。しかし、Call
関数では、これらの値は正しく42
と40
です。したがって、reinterpret_cast
を介して関数ポインタを呼び出すと、これらの値が変化します。
私がここで間違っていることは何ですか?
私がで掘っが、何不足している可能性が高いのは、 'のstd :: decay'の使用であるしていません。全体として、これは良いプログラミングの習慣ではありません。非常に型が危険で、エラーが発生しやすい適切に設計されたクラス階層では、すべての型が正しい場合を除いて、コンパイルすべきではありません。あなたは解決しようとしている問題が何であれ、あなたのアプローチを完全に再考し、タイプセーフな完全な解決策を見つけようとするべきです。 –
[@SamVarshavchikのコメントに続く]そして、この目的のために、実際に解決しようとしている問題を述べるために質問を編集することをお勧めします。 – Rerito