Какой лучший способ создать шаблон функции только для специализации?

Есть ли лучший способ сделать следующее?

#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) может никогда не быть нулем.

В общем, я хочу знать, существует ли:

  1. другой способ сделать это.
  2. Я ошибаюсь, и BOOST_STATIC_ASSERT(sizeof(T)) действительно не может завершиться без инстанцирования.
  3. Единственный способ - позволить этому быть ошибкой компоновщика, как описано выше.
9
задан Billy ONeal 29 November 2011 в 03:27
поделиться