Я предоставляю библиотеку, которая поддерживает функциональную панель (). То, что происходит, когда вы передаете скалярное значение (например, 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
просто грязно
Да, с чертами:
#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
, У каждого из них есть соответствующая черта. Смотрите здесь для более подробной информации.
Других решений пока нет …