C ++ 11の新機能を利用するために、いくつかのC++コードのアップグレードに取り組んでいます。私は、常にではありませんが、ほとんどの場合、定数式を返す基本型を返すいくつかの関数を持つトレイトクラスを持っています。機能の有無によって違うことをしたいですconstexpr
。私は次のアプローチを思いついた:
template<typename Trait>
struct test
{
template<int Value = Trait::f()>
static std::true_type do_call(int){ return std::true_type(); }
static std::false_type do_call(...){ return std::false_type(); }
static bool call(){ return do_call(0); }
};
struct trait
{
static int f(){ return 15; }
};
struct ctrait
{
static constexpr int f(){ return 20; }
};
int main()
{
std::cout << "regular: " << test<trait>::call() << std::endl;
std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
}
追加のint
/パラメーターは、 SFINAE...
の後に両方の関数が使用可能である場合に、解像度をオーバーロードすることによって最初の関数が選択されるようにするためにあります。
これをClang3.2でコンパイルして実行すると、次のようになります。
regular: 0
constexpr: 1
したがって、これは機能しているように見えますが、コードが合法的なC++11であるかどうかを知りたいと思います。特に、 SFINAEのルールが変更されたことが私の理解です。