gpt4 book ai didi

c++ - 是否可以自动推导函数模板的模板参数的基类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:29 26 4
gpt4 key购买 nike

是否可以编写一个模板函数来拥有关于模板参数基类的类型信息? (假设模板参数仅派生自一个类)

所以,我正在寻找这样的东西:

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 组件的内容。我想稍后为两个和三个基类添加我的函数重载。

最佳答案

你要找的 SFINAE 东西一般是不可能的。你会为多重继承做什么?私有(private)/ protected 继承?我敢打赌还有更复杂的问题我还没有考虑过。我看到的唯一方法是始终如一地使用一些反射库(而不仅仅是单个宏),您可以在其中明确定义您想要获得的结果。

相反,您可能正在寻找的非 SFINAE 和非令人兴奋的方式是简单地为 NodeBase 重载您的函数一次,然后通过 (const-)reference 传递派生类型:

auto f(NodeBase const& t)
{
std::cout << t << std::endl;
}

调用 f(NodeData{}) 将自动获取对基类 NodeBase 的引用。请注意,引用在这里很重要,否则您将对派生对象进行切片。

关于c++ - 是否可以自动推导函数模板的模板参数的基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com