gpt4 book ai didi

c++ - 指向成员函数的指针的模板参数推导?

转载 作者:可可西里 更新时间:2023-11-01 18:37:12 26 4
gpt4 key购买 nike

我正在尝试构建一个静态绑定(bind)的委托(delegate)类,其中成员函数在编译时绑定(bind),从而有助于优化。

我有以下代码,它完全符合我的要求:

#include <iostream>

namespace thr {

template<typename T, T func>
struct delegate;

template<typename R,
typename C,
typename... A,
R (C::* mem_fun)(A...)>
struct delegate<R(C::*)(A...), mem_fun>
{
delegate(C* obj_)
: _obj(obj_)
{}

R operator()(A... a)
{
return (_obj->*mem_fun)(a...);
}
private:
C* _obj;
};

} // namespace thr

struct foo
{
double bar(int i, int j)
{
return (double)i / (double)j;
}
};

int main()
{
foo f;

typedef thr::delegate<decltype(&foo::bar), &foo::bar> cb;
cb c(&f);

std::cout << c(4, 3);
return 0;
}

但是,用法不是很优雅:

thr::delegate<decltype(&foo::bar), &foo::bar>

我想使用一个函数模板来推导模板参数并返回一个委托(delegate)实例;类似的东西(此代码无法编译):

template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}

这将允许更优雅的语法:

auto cb = bind(&foo::bar, &f);

是否可以在函数模板中推导非类型参数?

我想要实现的目标是否可行?

最佳答案

std::function 有帮助吗? http://www2.research.att.com/~bs/C++0xFAQ.html#std-function你的例子看起来很接近。

我认为编译器提供的 STL 做了非常可怕的事情来让它顺利工作。在放弃之前,您可能想看看这个例子。

编辑:我出去尝试了你想要完成的事情。我的结论是编译错误:

  • 绑定(bind)(委托(delegate))的返回类型必须命名指向成员的指针,因为这是您自己的要求。
  • bind 应该接受指向成员的指针的名称是优雅的(即您的要求)
  • 编译器要求您不要使用函数参数隐藏模板参数或在参数和返回类型中使用名称。

因此您的一个要求必须满足。

编辑 2:我冒昧地更改了您的委托(delegate),以便按照您的意愿进行绑定(bind)。不过,绑定(bind)可能不是您的首要任务。

#include <iostream>

namespace thr {


template<typename C,typename R,typename... A>
struct delegate
{
private:
C* _obj;
R(C::*_f)(A...);
public:
delegate(C* obj_,R(C::*f)(A...))
: _obj(obj_),_f(f)
{}

R operator()(A... a)
{
return (_obj->*_f)(a...);
}

};

} // namespace thr

template<class C,typename R,typename... A> thr::delegate<C,R,A...> bind(R(C::*f)(A...),C* obj){
return thr::delegate<C,R,A...>(obj,f);
}

struct foo
{
double bar(int i, int j)
{
return (double)i / (double)j;
}
};

int main()
{
foo f;
auto c = bind(&foo::bar, &f);
std::cout << c(4, 6);
return 0;
}

关于c++ - 指向成员函数的指针的模板参数推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9068628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com