【发布时间】:2020-12-14 04:52:21
【问题描述】:
让我们假设这个类使用 C++14(和原始的 QtRO 系统)。 https://pastebin.com/EVT4XJiz
#include <iostream>
#include <functional>
#include <memory>
class QTRO_1Source {
public:
void hvEnabledChanged(bool) {};
virtual bool hvEnabled() const = 0;
};
class QTRO_1SimpleSource : public QTRO_1Source {
public:
bool hvEnabled() const override { return false; }
};
class QTRO_1 : public QTRO_1SimpleSource {
public:
void write_hvEnabled(bool/*enabled*/) { }
};
template<typename ReplicaType, typename ValueType>
class ProxyProperty
{
public:
using ReadFuncPtr = ValueType (ReplicaType::*)() const;
using WriteFuncPtr = void (ReplicaType::*)(ValueType);
using ChangeSigFuncPtr = void (ReplicaType::*)(ValueType);
using UpdateHandlerFunctor = std::function<void(ValueType value)>;
ProxyProperty(ReplicaType *replica,
ReadFuncPtr readFunc,
WriteFuncPtr writeFunc,
ChangeSigFuncPtr changeSignal,
UpdateHandlerFunctor updateHandler)
{
m_replica = replica;
m_readFunc = readFunc;
m_writeFunc = writeFunc;
m_changeSignal = changeSignal;
m_updateHandler = updateHandler;
}
template<typename T, typename HandlerT>
void write(T value, HandlerT handler) {
(m_replica->*m_writeFunc)(value);
}
private:
ReplicaType *m_replica;
ReadFuncPtr m_readFunc;
WriteFuncPtr m_writeFunc;
ChangeSigFuncPtr m_changeSignal;
UpdateHandlerFunctor m_updateHandler;
int m_timeout{3000};
};
template<typename ReplicaType, typename ValueType, typename UpHandlerT>
auto createProxyProperty(ReplicaType *replica,
ValueType (ReplicaType::*readFunc)() const,
void (ReplicaType::*writeFunc)(ValueType),
void (ReplicaType::*changeSignal)(ValueType),
UpHandlerT upHandler)
{
return std::make_unique<ProxyProperty<ReplicaType,ValueType> >(replica, readFunc, writeFunc, changeSignal, upHandler);
}
int main(int argc, char *argv[]){
QTRO_1 model;
// static auto p = createProxyProperty<QTRO_1, bool>(
static auto p = createProxyProperty(
&model,
&QTRO_1::hvEnabled,
&QTRO_1::write_hvEnabled,
&QTRO_1::hvEnabledChanged,
[](auto val) { std::cout<< "COSTAM"; }
);
}
现在,当我将它与第一行一起使用时(同时给出两种类型) - 它可以工作。当我在编译器上移动类型推导时 - 我收到此错误错误。
错误:没有匹配函数调用‘createProxyProperty(QTRO_1*, bool (QTRO_1SimpleSource::)() const, void (QTRO_1::)(bool), void (QTRO_1Source::*)(bool), main(int, char**)::
)’ 76 | );
是的,所有 3 个方法都来自继承树中的不同类(QTRO_1 来自 QTRO_1SimpleSource 来自 QTRO_1Source)。我可以 - 当然 - 将这些方法包装在 std::function 中。
我想让编译器为我推断类型。
怎么做?
PS:添加了最少的复制代码。
【问题讨论】:
标签: c++ templates inheritance