我試圖給出一個友好的名稱,類型爲模板類型名,因爲我需要在函數內的幾個地方使用的名稱。基於在參數組其他模板參數數量的類型被推斷,如下圖所示:模板類型!=推演型
#include <cassert>
#include <functional>
#include <type_traits>
template < typename ... TArgs, typename Functor = std::function< std::conditional_t< sizeof...(TArgs) == 0, int(), int (TArgs...) > > >
void DoStuff(const Functor & func, TArgs ... args) {
if constexpr (sizeof...(TArgs) == 0)
assert(typeid(Functor).hash_code() == typeid(std::function<int()>).hash_code());
else
assert(typeid(Functor).hash_code() == typeid(std::function<int (TArgs...)>).hash_code());
}
int main(int argc, char * argv[]) {
DoStuff([]() { return 5; });
DoStuff([] (int a) { return a; });
return 0;
}
這編譯就好了,但兩者的斷言失敗,因爲別名Functor
實際上不是std::function<>
。在另一方面,如果我改變代碼重複的Functor
定義在typeid
調用它完美的作品,象下面這樣:
#include <cassert>
#include <functional>
#include <type_traits>
template < typename ... TArgs, typename Functor = std::function< std::conditional_t< sizeof...(TArgs) == 0, int(), int (TArgs...) > > >
void DoStuff(const Functor & func, TArgs ... args) {
if constexpr (sizeof...(TArgs) == 0)
assert(typeid(std::function< std::conditional_t< sizeof...(TArgs) == 0, int(), int (TArgs...) > >).hash_code() == typeid(std::function<int()>).hash_code());
else
assert(typeid(std::function< std::conditional_t< sizeof...(TArgs) == 0, int(), int (TArgs...) > >).hash_code() == typeid(std::function<int (TArgs...)>).hash_code());
}
int main(int argc, char * argv[]) {
DoStuff([]() { return 5; });
DoStuff([] (int a) { return a; });
return 0;
}
爲什麼第一個聲明(使用typname Functor = ...
)不正確的?有沒有不同的方式來製作別名?請注意,在回答第二個問題,這是確定如果解決方案是一個常量表達式,這些例子只是不constexpr
使用typeid
的感覺。
@ Jarod42還是失敗,都斷言:/ – Howard
什麼是你要解決實際問題?你爲什麼認爲你需要這個別名? – Barry
@Barry我想消除在我需要的3個地方重複定義的需要。我寧願定義一次,並在其他地方使用別名 – Howard