У меня есть простой вопрос, касающийся специализации функций с типами возвращаемых данных. Мне не удалось найти другой пост, который отвечает на мой вопрос, но, возможно, этот пост существует, и я просто не понимаю его (или я не нашел его). Итак, надеюсь, это не повторение, но здесь это идет:
Следующий код иллюстрирует мою проблему:
хиджры
class A {
//...
template<typename T> T func() {
cout << "Generic" << endl;
T temp;
return temp;
}
}
a.cpp
//...
template<> inline double A::func<double>() {
cout << "Double" << endl;
double d;
return d;
}
Использование:
int main() {
A a;
int var1 = a.func<int>();
double var2 = a.func<double>();
}
Что вы, вероятно, можете извлечь из кода, так это то, что я хочу специализировать FUNC () функционировать в том случае, когда двойной это параметр шаблона. Однако при запуске вижу:
общий
общий
Вместо:
общий
двойной
Почему общая версия вызывается оба раза? Как я могу получить поведение, которое я хочу?
Я также быстро опишу ситуацию в реальной жизни, на случай, если ответ на мой вопрос «вы, вероятно, никогда не захотите этого делать». Я просто хочу написать класс, который анализирует аргументы командной строки (строки) в различных типах данных (int, double, bool и т. Д.). Один очевидный подход — написать отдельную функцию для каждого желаемого типа. Другой подход может состоять в том, чтобы передать переменную по ссылке, а не возвращать значение, и перегрузить функцию для каждого типа.
Тем не менее, я думал, что специальная функция создаст более расширяемый код. Моя цель состояла в том, чтобы вызвать ошибку для общего случая, с некоторым сообщением об ошибке, говорящим что-то вроде: «Я еще не реализовал парсер для вашего целевого типа», в то время как каждый специализированный случай будет реализовывать соответствующую строку втип синтаксический анализатор. Я подумал, что это позволило бы мне добавлять парсеры для новых типов в дальнейшем без необходимости изменять исходные файлы классов, что актуально для меня, так как я встраиваю этот парсер аргументов в библиотеку.
Хорошо, надеюсь, это имеет смысл. Меня больше интересует объяснение того, почему код не выполняет то, что я ожидаю, чем решение, но это приветствуется!
Специализация функции «скрыта» внутри файла .cpp, поэтому компилятор никогда не видит ее при компиляции main
(который предположительно включает в себя только A.h
).
Чтобы это исправить, объявите специализацию в A.h
:
class A {
// ...
};
template<> double A::func<double>();
Если вы сохраните inline
Вы также можете переместить все определение функции в заголовок.
Других решений пока нет …