String-literal als Template Parameter
-
template< const char* p > struct T { }; T< static_cast< const char* >( "a" ) > t;bringt bei mir:
error C2762: 'T' : invalid expression as a template argument for 'p' : see declaration of 'T'
geht so etwas überhaupt, und wenn ja, wie?
-
AFAIK dürfte sowas nicht gehen, da du einen Parameter mit externer Bindung brauchst, ein String Literal aber interne Bindung hat (14.3.2-2).
-
groovemaster schrieb:
AFAIK dürfte sowas nicht gehen, da du einen Parameter mit externer Bindung brauchst, ein String Literal aber interne Bindung hat (14.3.2-2).
das stimmt; also machen wir einen String mit externer Bindung.
#include <iostream> extern const char txt[]; template< const char* Txt > struct Foo { static const char* name() { return Txt; } }; const char txt[] = "Hugo"; int main() { using namespace std; cout << Foo< txt >::name() << endl; return 0; }Gruß
Werner
-
besser als extern funktioniert aber static
-
Hallo,
eine andere Annäherung, die aber natürlich nicht in allen Situationen praktikabel ist, sieht so aus:struct Strings { const char* hello() const {return "hello";} const char* world() const {return "world";} }; template <const char* (Strings::*p)() const> class Foo {}; int main() { Foo<&Strings::hello> f1; Foo<&Strings::world> f2; }
-
otze schrieb:
besser als extern funktioniert aber static
Wie meinen?
-
otze schrieb:
besser als extern funktioniert aber static
Aber nur als Klassen Member. Im Namensraum hat der Bezeichner wiederum interne Bindung und ist somit kein gültiges Argument.