Как отметил другой ответ, полукокс указателя на bool
к конверсии является предпочтительным, поскольку это не влечет за определенным пользователем преобразования, в то время как std::string
преобразование имеет определенный пользователь преобразование в нем.
C++ 11 предлагает возможность управления ручным типом.
template<size_t n>
struct enumarated_enum {
private:
enum empty {};
};
template<bool b, size_t n=0>
using EnableIf = typename std::enable_if< b, typename enumerated_enum<n>::empty >::type;
template<typename String, EnableIf< std::is_convertible< String, std::string >::value >... >
Foo& operator=(String&& s) {
cout << "string overload" << "\n";
}
// either this:
template<typename Bool, EnableIf< !std::is_convertible< Bool, std::string >::value && std::is_convertible< Bool, bool >::value, 1 >... >
Foo& operator=(Bool&& b) {
cout << "bool overload" << "\n";
}
// or this:
Foo& operator=(bool b) {
cout << "bool overload" << "\n";
}
где мы сопоставляем тип идеально, если он может быть преобразован в std::string
, а шаблон не соответствует, если он не может быть преобразован в std::string
и других перегруженных просматривается.
Если у вас есть много типов, которые вы хотите поддерживать, вы должны использовать длинные логические формы, которые описывают, какие из перегрузок вы хотите запустить, и убедитесь, что другие не принимают его (с неконструкцией выше). Если у вас есть только два типа, второй тип может быть традиционной перегрузкой. Перегрузка шаблона получает первую трещину во всем, что не соответствует традиционной перегрузке точно ...
(Второй аргумент шаблона - это переменный список пронумерованных enum
s, которые не могут существовать, цель которого состоит в том, чтобы убедиться, что два шаблона отличаются, чтобы компилятор не жаловался.)
Что? В этой перегрузке есть только один UDT. (Кроме этого, 100% правильно) –
@MooingDuck Да, вы правы. Это имело смысл, когда я набрал ответ, не задумываясь! – juanchopanza
+1: Это может удивить новичков языком, что тип, определенный Стандартом, будет классифицироваться как ** пользовательский ** определенный тип, но там вы идете! – Johnsyweb