【发布时间】:2015-10-17 11:00:48
【问题描述】:
在answering 提出问题时,我建议使用模板别名来定义成员函数的签名;也就是说,不仅仅是定义一个成员函数,而且能够分解出包含该方法的目标类:
template<typename T>
using memberf_pointer = int (T::*)(int, int);
虽然这似乎涵盖了问题的内容,但我尝试将其概括为任意函数参数:
template<typename T, typename... Args>
using memberf_pointer = int (T::*)(Args&&...);
它因参数推导问题而失败(基本上它假定一个空参数列表)。这是demo:
#include <iostream>
class foo
{
public:
int g (int x, int y) { return x + y ; }
};
template<typename T, typename...Args>
using memberf_pointer = int (T::*)(Args&&...);
int main()
{
foo f ;
memberf_pointer<foo> mp = &foo::g ;
std::cout << (f.*mp) (5, 8) << std::endl ;
}
这是为什么?有没有办法让它工作?
【问题讨论】:
-
为什么不直接使用
auto?auto mp = &foo::g ;应该可以工作。 -
分配右值不是成员函数参数的推导上下文。不过有一些解决方法:Solution 1 和 Solution 2
-
@Nawaz 我正在使用命令模式并想确保我将接收器的成员函数传递给命令对象的构造。在那种情况下,拥有一个“有意识”的 typedef 会很不错(另一种选择是构建一个特征系统或使用概念)。
auto太棒了,可惜不是我的情况
标签: c++ templates c++11 c++14 template-argument-deduction