テンプレート引数に基づいて2つの異なる実装を持つテンプレート関数を作成しようとしています。最初のものはI/Oマニピュレータに固有のものであり、2つ目は一般的なものです。テンプレート型を呼び出す方法
template <typename T>
typename std::enable_if<
std::is_same<decltype(std::setw), T>::value>::type
foo(T& t){
cout << "enabled" << std::endl;
}
template <typename T>
void foo(T& t){
cout << "Normal" << std::endl;
}
template <typename... Ts>
void foohelper(Ts... t){
foo(t...);
}
int main(){
foohelper(std::setprecision(3)); // It should print enabled, but printing Normal
}
現在のところ、実装しようとしていることを行っていません。どうすれば修正できますか?
std :: setとstd :: setprecisionは同じ型ではありません(また、std :: setprecision(3)はstd :: setprecisionと同じ型ではありません)。答え! – bendervader
はい、私はstd :: setwを意味しました。それらは実際には異なっています。ソースコードはhttp://cs.brown.edu/~jwicks/libstdc++/html_user/iomanip-source.htmlを参照してください。構造体を返しますが、構造体ごとに異なる名前が付いています。 'std :: cout << typeid(decltype(std :: setw))を検証するためにこれを試してください。name()<< std :: endl; std :: cout << typeid(decltype(std :: setprecision))。name()<< std :: endl; ' – bendervader