我有一门课:
struct C {
int F(int, char) { return 0; }
};我还需要创建一个std::function,它将调用变量c的C::F函数
C c;
std::function<int(int, char)> f;
...
f = std::bind(&C::F, &c, _1, _2);但是如果函数的签名改变了,我也需要改变std::函数。
所以我不想重复签名:
C c;
std::function<delete_class<decltype(&C::F)>::type> f;
...
f = std::bind(&C::F, &c, _1, _2);其中delete_class是一些神奇的帮助器,它将类型int(C::*)(int, char)更改为int(int, char)。
我怀疑,我可以在boost::mpl或boost::function_types的帮助下实现它,但我做不到。
有经验的人可以教我怎么做吗?
PS。VS 2010
发布于 2013-04-26 00:44:48
如果您需要一个可以按您的期望工作的类型特征delete_class,下面的代码应该可以满足您的需求:
template<typename S>
struct delete_class;
template<typename R, typename C, typename... Ts>
struct delete_class<R (C::*)(Ts...)>
{
using type = R(Ts...);
};然后将满足以下断言:
static_assert(
std::is_same<delete_class<decltype(&C::F)>::type,
int(int, char)
>::value, "!");然后,您可以按照您建议的方式使用delete_class<>:
std::function<delete_class<decltype(&C::F)>::type> f;
C c;
f = std::bind(&C::F, &c, _1, _2);这是一个。
编辑:
如果您仅限于VC10支持(即没有可变模板),则必须定义delete_class主模板的几个部分专门化:
template<typename S>
struct delete_class;
template<typename R, typename C>
struct delete_class<R (C::*)()>
{
typedef R(type)();
};
template<typename R, typename T>
struct delete_class<R (C::*)(T)>
{
typedef R(type)(T);
};
template<typename R, typename T, typename U>
struct delete_class<R (C::*)(T, U)>
{
typedef R(type)(T, U);
};
template<typename R, typename T, typename U, typename V>
struct delete_class<R (C::*)(T, U, V)>
{
typedef R(type)(T, U, V);
};
// And so on...https://stackoverflow.com/questions/16220269
复制相似问题