1

Как реализовать сообщение об ошибке, когда пользователь библиотеки использует неправильный тип для аргумента шаблона класса шаблона?Внедрить сообщение об ошибке для специализации класса класса

test.cpp (адаптируются от here)

#include <type_traits> 
template <typename T, typename Enable = void> 
class foo; // Sorry, foo<T> for non-integral type T has not been implemented. 

template <typename T> 
class foo<T, typename std::enable_if<std::is_integral<T>::value>::type> 
{ }; 

int main() 
{ 
    foo<float> x; 
} 

код не компилируется, как и ожидалось. Но я не могу заставить компилятор показать ошибку только тогда, когда пользователь использовал неправильный тип.

Сообщение об ошибке в g++ test.cpp

test.cpp: In function ‘int main()’: 
test.cpp:11:13: error: aggregate ‘foo<float> x’ has incomplete type and cannot be defined 
    foo<float> x; 

Проблема: Это не печатает сообщение об ошибке, что я хочу (Sorry, foo<T> for non-integral type T has not been implemented.)

ответ

4

static_assert будет делать трюк:

template <typename T, typename Enable = void> 
class foo 
{ 
    static_assert(sizeof(T) == 0, "Sorry, foo<T> for non-integral type T has not been implemented"); 
}; 

Demo

Вам нужен sizeof(T) == 0, потому что static_assert всегда оценивается и должен зависеть от T, иначе он будет всегда срабатывать, даже для действительного T.