Фон
В своем предложении , а также в разговоре CppCon Херб Саттер предлагает добавить метаклассы в C ++.Это позволяет пользователям иметь гораздо большую гибкость в плане создания и расширения новых типов во время компиляции.Одним из примеров в предложении является создание метакласса interface
или метакласса the plain-struct
.
В текущей реализации C ++ есть три ключевых слова для объявления типов: class
, struct
и enum
.
Представьте, что мы создали новый метакласс plain_struct
, который позволяет нам писать код, подобный
plain_struct User {
string name;
string surname;
};
. Позже мы можем получить функцию илиclass-метод, который принимает параметр шаблона, такой как
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"