У меня есть следующий случай, который работает с использованием std::enable_if
:
template<typename T,
typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }
template<typename T,
typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Теперь я увидел в cppreference новый синтаксис, который, на мой взгляд, намного чище: typename = std::enable_if_t<std::is_same<int, T>::value>>
Я хотел портировать свой код:
template<typename T,
typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }
template<typename T,
typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Но теперь GCC (5.2) жалуется:
error: redefinition of 'template<class T, class> void g()'
void g() { }
Почему это так ? Что я могу сделать, чтобы иметь новый, более краткий синтаксис в этом случае, если это возможно?
enable_if_t
буквальноstd::enable_if_t<std::is_same<int, T>::value>* = nullptr
. - person dyp   schedule 19.07.2015* = nullptr
. - person Kerrek SB   schedule 19.07.2015, typename = void
послеenable_if
- person Piotr Skotnicki   schedule 19.07.2015enable_if_t
@PiotrS. : Ok - person Jean-Michaël Celerier   schedule 19.07.2015typename std::enable_if_t<std::is_same<int, T>::value>* = nullptr
. Получилось 4 символа, да ладно :p - person Jean-Michaël Celerier   schedule 19.07.2015typename
передstd::enable_if_t
. Получено больше персонажей. - person bogdan   schedule 19.07.2015std::enable_if_t<std::is_same<int, T>::value, int> = 0
илиstd::enable_if_t<std::is_same_v<int, T>, int> = 0
. - person Oktalist   schedule 19.07.2015*=0
, а не на*=nullptr
. - person Jean-Michaël Celerier   schedule 21.07.2015*=0
. Я указалint
в качестве второго аргумента дляenable_if_t
вместо стандартногоvoid
, поэтому0
является целочисленным литералом, а не литералом нулевого указателя. - person Oktalist   schedule 21.07.2015