C++相談室 part129 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0191デフォルトの名無しさん (ワッチョイ 6f56-3qL8)
2017/01/22(日) 02:40:24.62ID:rrJzCAZR0環境は VisualC++2015 x64 です。
与えられた文字列の引数について、1文字が1バイトなのか、2バイトなのかで呼び出す関数を切り分けたいと思い、SFINAE で以下のようなコードを書きました。
しかし、こののコードで「関数A」を呼んで欲しいのに、「関数B」が呼ばれてしまいます。
- なぜ関数Bが呼ばれるのか
- 1文字のバイト数で切り替える手段
この2点について、教えて下さい。よろしくお願いします。
extern void* enabler;
// 関数A (本当は1文字が1バイトの時用の関数)
template <typename STR, std::enable_if_t<sizeof(decltype(std::remove_all_extents<STR>::type()[0])) == 1> *& = enabler>
void hoge(const STR&)
{
}
// 関数B (本当は1文字が2バイトの時用の関数)
template <typename STR, std::enable_if_t<sizeof(decltype(std::remove_all_extents<STR>::type()[0])) != 1> *& = enabler>
void hoge(const STR&)
{
int tmp;
tmp = sizeof(decltype(std::remove_all_extents<STR>::type()[0])); // どういう訳か tmp == 1 となる
}
void main()
{
std::string s;
hoge(s); // 1バイト版である、関数Aを呼んで欲しい
}
■ このスレッドは過去ログ倉庫に格納されています