2013-07-27 2 views
3

Есть ли способ в Visual Studio 2012 ограничить функциональные шаблоны конкретными типами?Ограничение типов шаблонов функций в Visual Studio 2012

Этот файл работает в GCC, но MSVC генерирует error C4519: default template arguments are only allowed on a class template.

#include <type_traits> 

template <class float_t, class = typename std::enable_if< std::is_floating_point<float_t>::value >::type> 
inline float_t floor(float_t x) 
{ 
    float_t result; 
    //... 
    return result; 
} 

Решение перекрестного компилятора было бы лучшим. Любая альтернатива?

ответ

3

Обычно, можно было бы написать это как

template <class float_t> 
typename std::enable_if< std::is_floating_point<float_t>::value, float_t>::type 
    floor(float_x x) {...} 

Вот как enable_if предназначен для использования.

+4

Я бы не сказал, что это означает, что use_if предназначен для использования или как он обычно используется. Это просто для того, чтобы обойти VS2012 отсутствие поддержки параметров шаблона по умолчанию в функциях. – Rapptz

+1

@Rapptz: Это был оригинальный способ, с помощью которого enable_if должен был использоваться. Параметр шаблона функции по умолчанию - это новая вещь, относящаяся к enable_if. – Puppy

+1

@DeadMG Я не соглашусь. Однако, поскольку C++ 11 обычно помещается в параметры шаблона. В любом случае, это идеальное решение, если вашему компилятору не хватает поддержки. – Rapptz

Смежные вопросы