Я задал следующий вопрос в сообщении this (приклеенный ниже для удобства). В одном из комментариев было высказано мнение о том, что для решения проблемы существует CRTP-решение. Я не могу понять, как CRTP здесь имеет значение (ну, я никогда раньше не использовал CRTP, поэтому я не привык думать в этих терминах). Итак, как будет выглядеть CRTP-решение?Каким будет решение на основе CRTP?
Вот цитируемый вопрос:
Можно ли написать шаблонную функцию, которая обладала бы информацией о типе о базовом классе аргумента шаблона? (При условии, что аргумент шаблона происходит только из одного класса)
Итак, я ищу что-то вроде этого:
template <class T>
auto f(T t) -> decltype(...) { // ... is some SFINAE magic that
// catches B, the base of T
std::cout << (B)t << std::endl;
}
Некоторые соответствующие справочные материалы: Я пишу родовое реализацию алгоритма A*
. Аргумент шаблона - это структура Node
. Таким образом, пользователь может определить:
struct NodeBase {
REFLECTABLE((double)g, (double)f)
// Using the REFLECTABLE macro as described here:
// https://stackoverflow.com/a/11744832/2725810
};
struct NodeData : public NodeBase {
using Base1 = NodeBase;
REFLECTABLE((double)F)
};
Я хотел бы написать функцию, которая печатает содержимое структуры узла. REFLECTABLE
выполняет всю тяжелую работу по извлечению полей struct
. Однако, когда пользователь дает мне экземпляр NodeData
, моя функция также должна печатать содержимое компонента NodeBase
. Я хотел бы позже добавить перегрузки моей функции для двух и трех базовых классов.
Предполагается, что вы можете ограничить клиентские классы вашей функции специальным синтаксисом для объявления своих переменных-членов. Но тогда вы, кажется, не открыты, чтобы ограничить их использованием специального синтаксиса для объявления своего базового класса. Я не знаю всех подробностей ваших требований, но кажется правдоподобным, что CRTP может быть частью специального синтаксиса, который вы вынуждаете классы клиентов использовать для объявления своих базовых классов. 'struct NodeData: public baseHolder' –
JSF