人生初心者の雑記

すべてにおいてド素人な人がいろんなことを書くよ

やっぱりsfinaeわかんない

 前回

sfinaeのenabler 2/2 - 人生初心者の雑記

に関してもうちょい実験

//////////////////////////////////////

#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

 

定義のない関数のアドレスを渡すと、テンプレートの方が採用された。この代入は成功だと判断されるようだ。

 

わけわかめ