Есть ли способ обмануть компилятор, чтобы разрешить специализации шаблона в заголовочном файле? - PullRequest
2 голосов
/ 08 сентября 2011

Обычно, когда вы пишете шаблонный класс и у вас есть специализация функции в этом классе, вам нужно поместить специализацию в файл .cpp, так как это конкретное определение (а не определение шаблона).Если у вас есть только одна крошечная функция для специализации, хотя это немного раздражает, и иногда вы можете забыть поискать в этом файле .cpp последнее определение, которое может вызвать путаницу.

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

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Используйте ключевое слово inline:

template <unsigned N>
unsigned get_const()
{
    return N;
}

template <>
inline unsigned get_const<42>()
{
    throw "meaning of life";
}

Ключевое слово указывает, что несколько определений должны быть одинаковыми и, следовательно, не являются ошибкой.(Это ортогонально static, который сохраняет повторяющиеся определения в своих собственных единицах перевода.)

Обратите внимание, что это работает со всеми функциями, а не только с шаблонами или специализациями.

1 голос
/ 08 сентября 2011

Специализации можно заключить в пустые namespace, но это может привести к тому, что они будут определены в другом пространстве имен. Затем вы можете создать псевдонимы в пустом пространстве имен, которые typedef s для этих специализаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...