2016-05-12 2 views
1

Предположим, у меня есть функция:Есть ли способ дать лучшие ошибки при std :: условном сбое?

template<typename T, typename Dummy = 
          typename std::enable_if<std::is_integral<T>::value,int>::type > 
void foo(T var0, T var1); 

Эта функция только создается, если T некоторый интегральный тип. Единственная проблема заключается в том, что если я попытаюсь использовать его в нецелевом типе, я получаю эту огромную ошибку.

Есть ли способ создать настраиваемую строку ошибок, которая происходит в аналогичном сценарии?

+0

На самом деле, ваш пример даже не работает для меня: http://coliru.stacked-crooked.com/a/edfd2163b75a8b12 –

+0

@BaummitAugen Это не удастся, потому что удвоения не являются целыми – DarthRubik

+0

Я понимаю, что это должно произойти, но это не происходит с gcc и clang. Тб, я не знаю, почему. Может быть, стоит вопрос, если вам все равно. –

ответ

3

Просто падение манекена трюк и использовать static_assert, это как учебник USECASE:

#include <type_traits> 

template <class T> 
void fun(T t){ 
    static_assert(std::is_integral<T>::value, "fun requires integral"); 
} 

int main(){ 
    fun(1); 
    fun(2.); 
} 

терпит неудачу с совершенно ясным сообщением:

main.cpp: In instantiation of 'void fun(T) [with T = double]': 
main.cpp:10:11: required from here 
main.cpp:5:5: error: static assertion failed: fun requires integral 
    static_assert(std::is_integral<T>::value, "fun requires integral"); 
    ^~~~~~~~~~~~~ 

В некоторых более или менее отдаленном будущем, 2020 или так, вы также можете использовать concepts для этого, есть экспериментальная реализация в gcc, если вы хотите поиграть с этим.