考虑到继承,我如何通过引用传递?

How can I pass by reference considering inheritance?

提问人:markzzz 提问时间:7/5/2023 最后编辑:markzzz 更新时间:7/5/2023 访问量:59

问:

这是我的场景(注意我可以编辑的代码,我不能编辑的代码):

#include <iostream>

// the follow is untouchable (from sdk)
struct Base { };

template <class TParamQuantity = Base>
TParamQuantity* configParam(int paramId) { return NULL; }

// the follow is my code (can edit as I want)
struct BaseParamScaler { };
struct LogParamScaler : BaseParamScaler { };

template <BaseParamScaler &T>
struct QRange : Base { };

LogParamScaler gLogParamScaler;

int main()
{
    configParam<QRange<gLogParamScaler>>(0);
}

我想知道的是能够将(及其子项)传递给模板方法(来自 sdk)。BaseParamScalerconfigParam

有什么方法可以做到这一点吗?或者你会如何以某种奇特的方式做到这一点?C++11

注意:如果通过点/值/任何允许的东西,我可以这样做。但我相信使用模板是强制性的,与他们一起工作。configParam

编辑

第一个似乎有效的方法是添加模板本身的类型名,例如:

template <typename T, T &S>
struct QRange : Base { };

并且比调用:

configParam<QRange<LogParamScaler, gLogParamScaler>>(0);

但我不确定这个解决方案有多优雅。

C++11 模板 继承

评论

0赞 Igor Tandetnik 7/7/2023
如图所示,您可以将任何类型传递给 ,它将很好地可靠地为您提供该类型的 null 指针。目前尚不清楚练习的意义是什么——它看起来像一个非常精心设计的禁操作。这个故事一定还有更多你忽略提及的。应该做什么 - 肯定不只是返回 null?configParamconfigParam
0赞 markzzz 7/10/2023
@IgorTandetnik这是 configParam 方法 github.com/VCVRack/Rack/blob/...
0赞 Igor Tandetnik 7/10/2023
我不明白为什么您展示的代码不适用于该实现。当你尝试这样做时,你会遇到一些问题吗?是什么促使你问?configParam
0赞 Igor Tandetnik 7/10/2023
或者,您可以创建一个普通的非模板类,并在调用后将缩放器传递给它。类似 .请注意如何创建一个新对象(使用其默认构造函数)并返回指向该对象的指针,以便您可以进一步调整它。QRangeconfigParamconfigParam<QRange>(...)->setScaler(gLogParamScaler);configParam<T>T
1赞 Igor Tandetnik 7/11/2023
在 C++17 中,您可以编写 .但是在 C++11 中,我认为您无法避免明确拼写类型。或者,就像我说的,你可以创建一个非模板,并在运行时将缩放器传递给它。那么它就不必是全局变量了。template <auto& Scaler> ...QRange

答: 暂无答案