LINUX.ORG.RU

Различия между boost::enable_if и std::enable_if

 , ,


0

1

Вот код, который построил Джек:

#include <cstdint>
#include <type_traits>
//-------------------------------------------------------------------------
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_fundamental.hpp>
//-------------------------------------------------------------------------
template <typename T, typename Predicate = void> struct BoostTest;
template <typename T> struct BoostTest <T, typename boost::enable_if<boost::is_integral<T>>::type> { };
//-------------------------------------------------------------------------
template <typename T, typename Predicate = void> struct StdTest;
template <typename T> struct StdTest <T, typename std::enable_if<std::is_integral<T>::value_type>::type> { };
//-------------------------------------------------------------------------
int main(int argc, char** argv)
{
  StdTest<int> stdOk;       // Err???
  StdTest<float> stdErr;    // Err
  BoostTest<int> boostOk;   // Ok
  BoostTest<float> boostErr;// Err
  return 0;
}
На строке, где вызывается stdlib-ская реализация enable_if для проверки целочисленного типа g++ ругается на incomplete type and cannot be defined, как и в случае проверки float-а. Boost-овская реализация же срабатывает так, как и ожидалось. Что нужно сказать std::enable_if, чтобы в таком коде она корректно распознавала std::is_integral?

Компилятор: MinGW32-gcc 4.8.1

boost: 1.55

★★★

Последнее исправление: one_more_hokum (всего исправлений: 1)

Что нужно сказать std::enable_if, чтобы в таком коде она корректно распознавала std::is_integral?

template <typename T> struct StdTest <T, typename std::enable_if<std::is_integral<T>::value>::type> { };

value, а не value_type.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ой ять... И куда я только смотрел. Отчего-то этот ::value_type прицепился, сам не знаю, чего вдруг.

Спасибо.

one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.