Специализированные функции с универсальными типами возврата

У меня есть простой вопрос, касающийся специализации функций с типами возвращаемых данных. Мне не удалось найти другой пост, который отвечает на мой вопрос, но, возможно, этот пост существует, и я просто не понимаю его (или я не нашел его). Итак, надеюсь, это не повторение, но здесь это идет:
Следующий код иллюстрирует мою проблему:
хиджры

    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 и т. Д.). Один очевидный подход — написать отдельную функцию для каждого желаемого типа. Другой подход может состоять в том, чтобы передать переменную по ссылке, а не возвращать значение, и перегрузить функцию для каждого типа.

Тем не менее, я думал, что специальная функция создаст более расширяемый код. Моя цель состояла в том, чтобы вызвать ошибку для общего случая, с некоторым сообщением об ошибке, говорящим что-то вроде: «Я еще не реализовал парсер для вашего целевого типа», в то время как каждый специализированный случай будет реализовывать соответствующую строку втип синтаксический анализатор. Я подумал, что это позволило бы мне добавлять парсеры для новых типов в дальнейшем без необходимости изменять исходные файлы классов, что актуально для меня, так как я встраиваю этот парсер аргументов в библиотеку.

Хорошо, надеюсь, это имеет смысл. Меня больше интересует объяснение того, почему код не выполняет то, что я ожидаю, чем решение, но это приветствуется!

0

Решение

Специализация функции «скрыта» внутри файла .cpp, поэтому компилятор никогда не видит ее при компиляции main (который предположительно включает в себя только A.h).

Чтобы это исправить, объявите специализацию в A.h:

class A {
// ...
};

template<> double A::func<double>();

Если вы сохраните inlineВы также можете переместить все определение функции в заголовок.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]