既出でしたらすみません。
型推論でコンテナが推論されているかつ、テンプレート引数の推論がstd::stringの時のみ特殊化を考えていたのですが、うまくいきません。
どうにか特殊化する方法はないでしょうか。
cpp
1template<typename T, typename = void> 2struct is_container : std::false_type {}; 3 4template<typename... Ts> 5struct is_container_helper {}; 6 7template<typename T> 8struct is_container< 9 T, 10 std::conditional_t< 11 false, 12 is_container_helper< 13 typename T::value_type, 14 typename T::size_type, 15 typename T::iterator, 16 typename T::const_iterator, 17 decltype(std::declval<T>().size()), 18 decltype(std::declval<T>().begin()), 19 decltype(std::declval<T>().end()), 20 decltype(std::declval<T>().cbegin()), 21 decltype(std::declval<T>().cend()), 22 decltype(std::declval<T>().back()) 23 >, 24 void 25 > 26> : public std::true_type {}; 27 28template <typename T> 29constexpr auto is_container_v = is_container<T>::value; 30 31template<typename T, std::enable_if_t<is_container_v<std::remove_reference_t<T>>, std::nullptr_t> = nullptr> 32auto f(T) { 33 std::cout << "call container" << std::endl; 34} 35 36/* 37そもそもエラー 38template <typename T> 39auto f(T<std::string>) { 40 std::cout << "call specialization" << std::endl; 41} 42*/ 43 44// エラーにはならないが呼ばれない 45template<template<typename Elem>typename T> 46auto f(T<std::string>) { 47 std::cout << "call specialization" << std::endl; 48} 49 50int main () { 51 // ともに"call container"が呼ばれる 52 f(std::vector<int>()); 53 f(std::vector<std::string>()); 54}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/25 10:50
退会済みユーザー
2020/03/26 15:42 編集
退会済みユーザー
2020/03/27 12:08