ジェネリック型を文字列に変換する関数を実装しようとしました。積分型は、std::string()
を使用してstd::to_string()
、文字列と文字を使用して、要素ごとにベクトルを、他の方法の1つ(内容に応じて)を使用して文字列に変換する必要があります。enable_ifと複数の条件の問題
これは私が持っているものです。
//Arithmetic types
template<class T>
typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type convertToString(const T& t){
return std::to_string(t);
}
//Other types using string ctor
template<class T>
typename std::enable_if<std::__and_<std::__not_<std::is_arithmetic<T>>::type,
std::__not_<std::is_same<T, <T,
std::vector<typename T::value_type, typename T::allocator_type>>::value
>>>::value, std::string>::type convertToString(const T& t){
return std::string(t);
}
//Vectors
template<class T>
typename std::enable_if<std::is_same<T, std::vector<typename T::value_type,
typename T::allocator_type>>::value, std::string>::type convertToString(const T& t){
std::string str;
for(std::size_t i = 0; i < t.size(); i++){
str += convertToString(t[i]);
}
return str;
}
問題は、第二の機能がコンパイルされないということです。 2番目の関数をコンパイル(および動作)し、あいまいさの問題を起こさないように、どのようにして2番目の関数を設計できますか?
これは非常にエレガントな解決法です:)私はenable_ifの構文のように、コードを読みにくくします。 – Overblade
これは本当に良い解決策です。それが一致する関数に達するまで、 'choice <0>'をスライスすることに気が付くまで、私はそれがどのように動作するかを理解するためにしばらく時間がかかりました。しかし、質問によれば、 'choice <0>'(これは現在選択されている)(http://www.news.com)ではなく 'choice <1>'バージョンで 'char'を処理したいと考えています。 /ideone.com/O3N4xB))。 –
@JustinTime 'char'は算術なので、これはOPの順序に一致します。フリップしやすい。 – Barry