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 回答