首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类型int(C::*)(int,char)转换为int(int,char)类型

问将类型int(C::*)(int,char)转换为int(int,char)类型
EN

Stack Overflow用户
提问于 2013-04-26 00:39:32
回答 1查看 180关注 0票数 2

我有一门课:

代码语言:javascript
复制
struct C {
    int F(int, char) { return 0; }
};

我还需要创建一个std::function,它将调用变量c的C::F函数

代码语言:javascript
复制
C c;
std::function<int(int, char)> f;
...
f = std::bind(&C::F, &c, _1, _2);

但是如果函数的签名改变了,我也需要改变std::函数。

所以我不想重复签名:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-26 00:44:48

如果您需要一个可以按您的期望工作的类型特征delete_class,下面的代码应该可以满足您的需求:

代码语言:javascript
复制
template<typename S>
struct delete_class;

template<typename R, typename C, typename... Ts>
struct delete_class<R (C::*)(Ts...)>
{
    using type = R(Ts...);
};

然后将满足以下断言:

代码语言:javascript
复制
static_assert(
    std::is_same<delete_class<decltype(&C::F)>::type, 
    int(int, char)
    >::value, "!");

然后,您可以按照您建议的方式使用delete_class<>:

代码语言:javascript
复制
std::function<delete_class<decltype(&C::F)>::type> f;
C c;
f = std::bind(&C::F, &c, _1, _2);

这是一个。

编辑:

如果您仅限于VC10支持(即没有可变模板),则必须定义delete_class主模板的几个部分专门化:

代码语言:javascript
复制
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...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16220269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档