C++ 有没有办法从基类函数参数推断模板参数?
我尝试为回调结构创建一个方便的包装器C++ 有没有办法从基类函数参数推断模板参数?,c++,templates,parameters,arguments,C++,Templates,Parameters,Arguments,我尝试为回调结构创建一个方便的包装器 class CallbackFilterProducts { public: virtual ~CallbackFilterProducts() {} virtual void onFinish(const optional<Page>& page, const vector<Product>& products) = 0; }; templat
class CallbackFilterProducts {
public:
virtual ~CallbackFilterProducts() {}
virtual void onFinish(const optional<Page>& page,
const vector<Product>& products) = 0;
};
template <typename T, typename... Args>
struct Callback : T {
Callback() {}
void onFinish(Args&&... args) override
{
_promise.set_value(make_tuple(forward<Args>(args)...));
}
auto&& promise() { return _promise; }
private:
promise<
tuple<remove_const_t<remove_reference_t<Args>>...>> _promise;
};
如果onFinish既不是重载的,也不是模板化的,因为它是虚拟的,那么您可以简单地编写未测试的:
template <typename T, typename Sig = decltype(&T::onFinish)>
struct Callback {};
template <typename T, typename... Args>
struct Callback<T,void(T::*)(Args...)> : T {
Callback() {}
void onFinish(Args... args) override;
};
这种用法看起来一点也不方便。即使是推断出的论点也不行。你有动态内存分配,虚拟函数调用,未来和承诺。。。你确定这就是你想要回调的方式吗?我正在使用的库只通过回调机制进行通信。所以,我必须创建许多相同类型的回调,并将回调放入回调,放入回调。。。这只是试图找出一种不同的方法。@anatol,注意,在你的评论之后,我纠正了一个复制粘贴错误,额外的&&不应该出现;此外,请记住,如果以后您添加onFinish重载,这将爆炸…为什么不简单地使用模板?@Aconcagua我认为这是不合法的,事实上,我的叮当声抱怨道,您使用的是什么编译器?IIRC vc++允许将其作为非标准扩展…@Aconcagua可能是一个gcc扩展;见和类似的…@MassimilianoJanes。很有趣,但你似乎是对的。。。另一方面,如果只删除std::remove_指针,而保留操作符的地址,GCC仍然编译;不过,这在某种程度上是有道理的,因为voidT:::*Args…(与之实例化)也是一种指针类型,不是吗?
auto callback = make_shared<Callback<CallbackFilterProducts>();
template <typename T, typename Sig = decltype(&T::onFinish)>
struct Callback {};
template <typename T, typename... Args>
struct Callback<T,void(T::*)(Args...)> : T {
Callback() {}
void onFinish(Args... args) override;
};