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;
};