在此答案中,我根據類型的is_arithmetic屬性定義一個模板:template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){ return to_string(t);}template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str();}dyp建議,is_arithmetic是否to_string為類型定義而不是類型的屬性作為模板選擇標準。這顯然是可取的,但我不知道一種說法:如果std::to_string未定義,則使用ostringstream重載。聲明to_string條件很簡單:template<typename T> decltype(to_string(T{})) stringify(T t){ return to_string(t);}與我無法弄清楚如何構造的標準相反。這顯然行不通,但希望它能傳達我正在嘗試構造的內容:template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){ return static_cast<ostringstream&>(ostringstream() << t).str();}
3 回答

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
使用Walter Brown的void_t:
template <typename...>
using void_t = void;
制作這樣的類型特征非常容易:
template<typename T, typename = void>
struct has_to_string
: std::false_type { };
template<typename T>
struct has_to_string<T,
void_t<decltype(std::to_string(std::declval<T>()))>
>
: std::true_type { };
- 3 回答
- 0 關注
- 366 瀏覽
添加回答
舉報
0/150
提交
取消