Семь лет спустя и вероятно простое решение затем, все еще работы сегодня.
template< char const * (*name) () >
struct user {
auto id() { return name(); }
} ;
Использование
constexpr auto lama () { return "Lama"; }
int main( int , char * [] )
{
auto amuser = user< lama >{} ;
cout << boolalpha << amuser.id() << endl ;
}
поклонники Лямбды обслуживаются также
auto cat = [] () constexpr { return "Cat"; } ;
auto sneaky = user< cat >{} ;
cout << boolalpha << sneaky.id() << endl ;