1

いろいろな投稿を読んで、以下はコンパイルされないはずだと理解しています。

#include <type_traits>
#include <iostream>

template <bool is_constant> struct A {
  // Need to fix this for g++-4.7.2
  // implicit conversion to int iff is_constant == true statically
  template <class = typename std::enable_if<is_constant>::type>
  constexpr operator int() const {
    return 10;
  }                                             
};

int main()
{
  A<true> a;
  int i = 2 + a;   
  std::cout << i << "\n";

  A<false> b;
  // int i = 2 + a;   // compilation error
}

それでも、clang 3.2はこのコードバージョンを受け入れ、正常に動作します。私の理解では、内部バージョンのenable_if_cを内部で使用しています。今、私はそれを受け入れないgccの下でこれをコンパイルしたいと思います。他の投稿と同じように、実際のタイプを用意してSFINAEを使用するとよいと思います。

私の場合:

  • 演算子を定義しようとしているので、デフォルトの型/値を持つ追加のパラメーターをいじくり回すことができません->SFINAEを使用できないようです。
  • すべてをconstexprに保持する必要があるため、継承も使用できません。
  • プロジェクト要件のため、コード(enable_if_c)にブーストインクルードを使用できません

抜け道はありますか?

4

1 に答える 1

0

なぜ専門化を使用しないのですか?

#include <iostream>

template <bool is_constant>
struct A {};

template <>
struct A<true> {
    constexpr operator int() const {
        return 10;
    }
};

int main()
{
    A<true> a;
    int i = 2 + a;
    std::cout << i << "\n";

    A<false> b;
    // int ii = 2 + b;   // compilation error
}

これは非常に簡単で、クロスコンパイラのアプローチです...

于 2013-02-14T03:32:37.183 に答える