enable_if + шаблон типа, без SFINAE (enable_if_c без повышения?)

Из различных постов я понимаю, что следующее не должно компилироваться.

#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) из-за требований проекта

У меня есть выход?

1

Решение

почему бы не использовать специализацию?

#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
}

это довольно прямой и кросс-компиляторный подход …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]