В его предложение а также CppCon talk, Херб Саттер предлагает добавить метаклассы в C ++. Это позволяет пользователям иметь гораздо большую гибкость в плане создания и расширения новых типов во время компиляции. Одним из примеров в предложении является создание interface
метакласс или the plain-struct
метаклассом.
В текущей реализации C ++ есть три ключевых слова для объявления типов: class
, struct
, а также enum
,
Представьте, что мы создали новый метакласс plain_struct
что позволяет нам писать код как
plain_struct User {
string name;
string surname;
};
И позже у нас может быть функция или метод класса, который принимает параметр шаблона, такой как
template <typename T>
void printUser(T user) {
cout << user.name << " " << user.surname << endl;
}
/*
...
*/
User u("N", "S");
printUser(u);
Есть ли способ перегрузить эту функцию или как-то обнаружить во время выполнения, если объект передан в функцию printUser
имеет метакласс struct
/class
или определенный пользователем plain_struct
,
Например, возможно ли иметь что-то подобное (следующий код больше похож на псевдокод, а не на реально работающий)?
template <class T>
void printUser(T user) {
cout << "User is of metaclass class";
}
template <plain_struct T>
void printUser(T user) {
cout << "User is of metaclass plain_struct";
}
/*
...
*/
User u("N", "S");
printUser(u); // prints "User is of metaclass plain_struct"
Задача ещё не решена.
Других решений пока нет …