Получить тип метакласса в C ++ - PullRequest
0 голосов
/ 16 октября 2018

Фон

В своем предложении , а также в разговоре 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"
...