私はC++コードの一部をアップグレードして、C++ 11の新機能を利用しています。ほとんどの場合(常にではありませんが)定数式を返す基本型を返すいくつかの関数を持つtraitクラスがあります。私はその機能がconstexpr
であるかどうかに基づいて異なることをしたいと思います。私は、次のアプローチを思い付いた:両方の機能がSFINAE後に使用可能である場合、最初のものは、解像度を過負荷によって選ばれますようにSFINAEで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
/...
パラメータがあります。
コンパイルとクラン3.2ショーでこれを実行している:
regular: 0
constexpr: 1
を
だから、これは動作しているように見えますが、私はコードは法的C++ 11であるかどうかを知りたいです。特に、SFINAEのルールが変更されていることを理解しているからです。
興味深い問題。私はそれが合法であることを証明していると思っていた答えを書いたが、その後、私の答えに従って等しく有効であったはずの[修正版](http://liveworkspace.org/code/SWmBI$5)を書いた。どのコンパイラでもコンパイルされません。だから私は答えを提出するつもりはないが、私は非常に興味がある。 –
関連:[is_constexprはC++ 11でも可能ですか?](http://stackoverflow.com/questions/13299394/is-is-constexpr-possible-in-c11)また、[デフォルトテンプレート引数のconstexprの呼び出し](http://stackoverflow.com/questions/10721130/calling-constexpr-in-default-template-argument)を参照してください。 –
@AndyProwl:私は不思議です、liveworkspace.orgや他の同様のサイトにあなたのソリューションを投稿することはできますか? –