假設我有以下核心類:鏈接到在編譯時動態地可用的功能
class Core {
public:
template<typename T>
void accept(T object);
}
我現在希望能夠寫這樣的方法:
void handle(int par);
和地方註冊它們期間鏈接/編譯階段並調用Core.accept(T)
方法中某個類型名稱註冊的正確方法。例如,在以某種方式註冊之後,呼叫 Core.accept(5)
將把5
轉移到handle(int)
函數。像這樣的東西(不可編譯的例子):
template<typename T>
void Core::accept(T par) {
// constexpr std::map<std::type_info, Function> type_func_mapping;
auto it = type_func_mapping.get(typeid(T)); // Should be constexpr
static_assert (it != type_func_mapping.end(), "No handler found for typename " + typeid(T).name())
auto function = *it; // Also constexpr
function(par);
}
這種方法有什麼問題/確實存在更好的嗎?
注意:我希望能夠以可以將它們存儲在只讀標頭/源文件中的方式提取類Core的源,甚至不必再次觸摸它們。
爲什麼你不能定義一個有很多'void handle(int par)的頭文件;無效句柄(double par); void handle(foo_class par);'重載?恐怕我不太明白你的要求和目標是什麼。 – dyp 2014-10-08 21:58:54
作爲上面的註釋,沒有理由有這個奇怪的工廠,從類型映射到功能。你可以根據呼叫類型做功能重載,它會做你想做的一切。 – 2014-10-08 22:09:07