Есть ли лучший способ сделать следующее?
#include <iostream>
template <typename T>
T Bar();
template <>
int Bar<int>() { return 3; }
// Potentially other specialisations
int main()
{
std::cout << Bar<int>() << std::endl; // This should work
std::cout << Bar<float>() << std::endl; // This should fail
}
Проблема с этим решением в том, что оно терпит неудачу во время (понятное дело) соединения с "undefined reference to float Bar
" или тому подобное. Это может сбить с толку других разработчиков, поскольку они могут заподозрить, что файл реализации не слинкован.
Я знаю другое потенциальное решение:
template <typename T>
T Bar() { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
Это вызывает ошибку компилятора при запросе Bar
, именно то, что я хочу. Однако, меня беспокоит, что технически компилятор может отвергнуть это так же, как gcc отвергает BOOST_STATIC_ASSERT(false)
, потому что он знает, что это не удастся независимо от параметра шаблона, поскольку sizeof(T)
может никогда не быть нулем.
В общем, я хочу знать, существует ли:
BOOST_STATIC_ASSERT(sizeof(T))
действительно не может завершиться без инстанцирования.