Шаблон для не встроенных, перегрузка для встроенных

Я предоставляю библиотеку, которая поддерживает функциональную панель (). То, что происходит, когда вы передаете скалярное значение (например, double, int и т. Д.), Отличается от того, что происходит, если вы передаете что-то, что не является скалярным значением (во всех ожидаемых случаях пользовательский тип). Поэтому я написал такой код:

#include <iostream>

class Foo
{
public:
template <class T> void bar(T const &rhs) { std::cout << "T" << std::endl; }
void bar(double rhs) { std::cout << "double" << std::endl; }
};

int main()
{
Foo foo;
foo.bar(4);
}

Проблема с этим находится на второй строке main (). Результатом этого кода является вывод «T». Компилятор предпочитает шаблон над вызовом bar (double), и я предполагаю, что это потому, что параметром является int, который он бы предпочел привести к int const& (так как& может ссылаться на значение r).

У меня вопрос: есть ли способ, которым я могу поддерживать каждое скалярное значение, не вызывая их явно? Я действительно не хочу называть все возможные типы, потому что … ну … их много. Я должен был бы охватить все от символа до длинного, включить каждую комбинацию изменчивых и неподписанных и так далее.

Я знаю, что просто изменение 4 на 4.0 работает, но это для публичного интерфейса к библиотеке и требует от пользователя ввода 4.0 вместо 4 просто грязно

2

Решение

Да, с чертами:

#include <type_traits>
#include <iostream>

class Foo
{
public:
template <class T>
typename std::enable_if<!std::is_scalar<T>::value, void>::type bar(T const & rhs)
{
std::cout << "T" << std::endl;
}

void bar(double rhs)
{
std::cout << "double" << std::endl;
}
};

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

4

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

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

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