やっぱりsfinaeわかんない
前回
に関してもうちょい実験
//////////////////////////////////////
#include<iostream>
#include<type_traits>
extern void * enabler;
extern constexpr void* func();
template<typename T,
typename std::enable_if<true>::type * foo = func() >////////////////
void f(T)
{
std::cout << "T is arithmetic" << std::endl;
}
void f(...){ std::cout << "no match" << std::endl; }
int main()
{
int arithmetic = 0;
f(arithmetic); // T is arithmetic
return 0;
}
///////////////////////////////////////
Ideoneによる結果
no match//除外が起きた
定義のないconstexpr関数の返り値をテンプレート実引数に使おうとすると、sfinaeが起きて候補から外れた。つまりテンプレート引数の代入は失敗する
こう書き換えてみる
template<typename T,
typename std::enable_if<true>::type * foo() = func >////////////////
void f(T)
{
std::cout << "T is arithmetic ha" << std::endl;
}
関数ポインタを実引数に渡すようにする。
ideoneによる結果
T is arithmetic
定義のない関数のアドレスを渡すと、テンプレートの方が採用された。この代入は成功だと判断されるようだ。