从方法参数推断模板
Infer template from method parameters
有没有办法让编译器从方法的签名推断模板参数?
我有这个课程,基于文章 不可能快速C++代表.
template<typename... Ds>
class Delegate {
public:
Delegate()
: object_ptr(0)
, stub_ptr(0)
{}
template <class T, void (T::*TMethod)(Ds...)>
static Delegate from_member(T* object_ptr)
{
Delegate d;
d.object_ptr = object_ptr;
d.stub_ptr = &method_stub<T, TMethod>; // #1
return d;
}
void operator()(Ds... ds) const
{
return (*stub_ptr)(object_ptr, ds...);
}
private:
typedef void (*stub_type)(void* object_ptr, Ds...);
void* object_ptr;
stub_type stub_ptr;
template <class T, void (T::*TMethod)(Ds...)>
static void method_stub(void* object_ptr, Ds... ds)
{
T* p = static_cast<T*>(object_ptr);
return (p->*TMethod)(ds...); // #2
}
};
要实例化这个类,有人会说
struct Foo {
void foo(int x, double y) {
std::cout << "foo(" << x << ", " << y << ")" << std::endl;
}
};
int main() {
Foo f;
auto d = Delegate<int, double>::from_member<Foo, &Foo::foo>(&f);
d(1, 2.3);
}
我的问题是:有没有办法让编译器从方法本身推断方法参数类型?也就是说,我是否可以避免在创建委托时指定<int, double>
,并让编译器为我解决这个问题?我希望能够说一些类似DelegateFactory::from_member<Foo, &Foo::foo>(&f)
的话.
#include <iostream>
template <typename... T>
class Delegate
{
};
template <typename T, typename... Args>
Delegate<Args...> from_member(T* t, void (T::*)(Args...))
{
return Delegate<Args...>(/* fill in, you have all data you need */);
}
struct Foo
{
void foo(int x, double y)
{
std::cout << "foo(" << x << ", " << y << ")" << std::endl;
}
};
int main()
{
Foo f;
auto d = from_member(&f, &Foo::foo);
return 0;
}
相关文章:
- c++方法参数只能在linux的发布模式下自行更改
- 使用移动语义:右值引用作为方法参数
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 将方法参数类型更改为子类中的派生类
- ofstream作为C 中的方法参数
- 使用 gmock 匹配器将 std::function 设置为 EXPECT_CALL 中的方法参数
- C com 方法参数扣除
- 获取非静态方法参数计数
- 使用 gmock 返回模拟方法参数
- 运行 QML 时出现"未知方法参数类型"错误
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- 将C 方法参数转换为模板参数会因编译错误而失败
- 如何在方法参数中使用boost :: asio :: buffer
- qsharedPointer作为方法参数或方法的返回值的良好实践
- 如何将方法指针声明为Typedef方法参数
- 方法参数中的 OpenCV 垫"预期")""
- 方法参数中的 consst* 常量
- 带有“class”详细类型说明符的方法参数
- 具有原始方法参数派生类的 C++ 重载方法参数
- C++ std::string length() 或 size() 不适用于方法参数