【发布时间】:2016-03-16 04:31:47
【问题描述】:
是否可以编写一个模板函数来拥有关于模板参数的基类的类型信息? (假设模板参数只派生自一个类)
所以,我正在寻找这样的东西:
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:
// http://stackoverflow.com/a/11744832/2725810
};
struct NodeData : public NodeBase {
using Base1 = NodeBase;
REFLECTABLE((double)F)
};
我想写一个打印节点结构内容的函数。 REFLECTABLE 完成了提取struct 字段的所有艰苦工作。但是,当用户给我一个NodeData 实例时,我的函数还需要打印NodeBase 组件的内容。我想稍后为两个和三个基类添加我的函数的重载。
【问题讨论】:
-
你有潜在基类的列表吗?
-
此代码将成为库的一部分,而 T 来自客户端。所以,没有。
-
您可以添加专门的
type_traits和template <> struct base_type<Derived1> { using type = Base1;};或要求 CRTP 直接在类中添加类型信息。 -
如果你没有得到基类的列表,如果你有
class B : private C, D {};,你怎么知道是要选择C还是D?跨度> -
请同时添加你想用它做什么,因为似乎自动基类检测可能不是正确的做法,或者你对基类的知识有什么用?