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

Ste*_*mer 7 c++ templates delegates c++11

我正在尝试构建一个静态绑定的委托类,其中成员函数在编译时绑定,从而帮助优化.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用不是很优雅:

thr::delegate<decltype(&foo::bar), &foo::bar>
Run Code Online (Sandbox Code Playgroud)

我想使用一个函数模板,它推导出模板参数并返回一个委托实例; 一些事情(这段代码不能编译):

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

这将允许更优雅的语法:

auto cb = bind(&foo::bar, &f);
Run Code Online (Sandbox Code Playgroud)

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

我正在努力实现的目标是什么?

Mat*_* M. 1

可以推导出函数签名中类型以外的其他实体,但函数参数本身不能用作模板参数。

鉴于:

template <size_t I> struct Integral { static size_t const value = I; };
Run Code Online (Sandbox Code Playgroud)

你可以有:

template <size_t N>
Integral<N> foo(char const (&)[N]);
Run Code Online (Sandbox Code Playgroud)

但你不能拥有:

Integral<N> bar(size_t N);
Run Code Online (Sandbox Code Playgroud)

在前一种情况下,N由于数组的大小是参数类型的一部分,因此在后一种情况下,数组的大小N是参数本身。可以注意到,在前一种情况下,N出现在类型签名的模板参数列表中。

因此,如果您想要的确实是可能的,则成员指针必须作为函数签名的模板参数列表的一部分出现。

使用 可能有一个节省的好处constexpr,它可以将常规值转换为适合模板参数的常量:

constexpr size_t fib(size_t N) { return N <= 1 ? 1 : fib(N-1) + fib(N-2); }

Integral<fib(4)> works;
Run Code Online (Sandbox Code Playgroud)

但我还没有足够的悟性走这条路......

不过,我确实有一个简单的问题:为什么您认为这会加快速度?编译器非常擅长不断传播和内联,当它们可以在编译时评估变量的动态类型时,就能够内联对虚拟函数的调用。你确定值得为此付出汗水吗?