我有一些靜態函數的類,並且包含指向這些函數的圖:PARAMS傳遞給可變參數函數通過函數指針改變它們的值
class Conditions
{
using cbType = bool(*)();
static std::unordered_map<std::string, cbType> const m_FunctionMap;
static bool Equal_int(const int A, const int B) { return A == B; }
static bool Equal_float(const float A, const float B) { return A == B; }
static bool Greater_int(const int A, const int B) { return A > B; }
static bool Greater_float(const float A, const float B) { return A > B; }
static bool Between_int(const int A, const int B, const int C) { return A > B && A < C; }
static bool Between_float(const float A, const float B, const float C) { return A > B && A < C; }
};
因此,靜態函數可以具有不同的參數數目與不同的類型。在.cpp文件我初始化該地圖:
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
他們的名字來調用這些靜態函數:
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
}
現在,當我運行此代碼,調用正確調用相應靜態函數的Call(std::string const& Key, argsType&& ... Args)
方法。例如:
Call("Greater_int", 42, 40);
然而,Greater_int()
函數內的那些兩個參數都沒有42和40中的任何多,但一些隨機值。但在Call
函數中,這些值正確地爲42
和40
。當通過reinterpret_cast
調用函數指針時,這些值會改變。
任何想法我在做什麼錯在這裏?
我沒有挖,但什麼是可能缺少的是'的std :: decay'的使用。總的來說,這不是一個好的編程習慣。非常不安全,容易出錯。通過設計合理的類層次結構,類似的東西甚至不應該編譯,除非所有類型都是正確的。您應該完全重新考慮您的方法,無論您嘗試解決什麼問題,並嘗試找出完全類型安全的解決方案。 –
[關注@SamVarshavchik的評論]爲此,我建議你編輯你的問題,說明你實際上試圖解決的問題。 – Rerito