【发布时间】:2015-12-11 12:25:48
【问题描述】:
我在this 帖子中提出了以下问题(为方便起见,粘贴在下面)。其中一位 cmets 建议有一个基于 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<NodeData,NodeBase>