Der folgende Code wird beim Aufrufen der Memberfunktion A :: Get mit einem Stringliteral static_assert, vermutlich weil die Funktion, die Namensauflösung überlädt, die Vorlage unabhängig davon, ob sie ausgewählt ist, instanziiert.static_assert Triggerung während der Namensauflösung
template<typename T>
struct helper
{
static_assert(std::is_integral<T>::value, "Must be integeral type");
typedef T type;
};
class A
{
public:
A()
{}
std::string Get(const char* value) const
{
return std::string(value) + " (non-template)";
}
template<typename T>
typename helper<T>::type Get(T value) const
{
return value;
}
};
ich die Assertion durch Hinzufügen einer ‚Helfer‘ Spezialisierung stoppen kann, aber es gibt auch andere Situationen, in denen die Hilfsklasse verwendet wird, und es macht keinen Sinn für ‚const char *‘ in anderen Situationen zu spezialisieren machen .
Gibt es eine Möglichkeit, den helper :: type in diesem Fall mit 'const char *' zu instanziieren? Wenn nicht, was ist eine bessere Möglichkeit, die Hilfsklasse zu entwerfen, um dieses Problem zu vermeiden?
Sie können [std :: enable_if] (http://en.cppreference.com/w/cpp/types/enable_if) überprüfen – Mine