首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#到C++11转换:委托模板

C#到C++11转换:委托模板
EN

Stack Overflow用户
提问于 2015-07-05 11:45:42
回答 1查看 319关注 0票数 5

我正在尝试将这个C#代码转换为C++:

代码语言:javascript
复制
public delegate void Action<in T>(T obj);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
public delegate void Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3);

很明显,这需要使用std::function。由于这是一个更大的项目,我使用了一个工具来完成所有的转换,这就是它得出的结果:

代码语言:javascript
复制
#include <functional>

    template<typename T>
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list:
//ORIGINAL LINE: public delegate void System::Action<in T>(T obj);
    using std::function<void()> = std::function<void (T obj)>;

    template<typename T1, typename T2>
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list:
//ORIGINAL LINE: public delegate void System::Action<in T1, in T2>(T1 arg1, T2 arg2);
    using std::function<void()> = std::function<void (T1 arg1, T2 arg2)>;

    template<typename T1, typename T2, typename T3>
//C# TO C++ CONVERTER TODO TASK: C++ does not allow specifying covariance or contravariance in a generic type list:
//ORIGINAL LINE: public delegate void System::Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3);
    using std::function<void()> = std::function<void (T1 arg1, T2 arg2, T3 arg3)>;

我认为使用std::function<void()>是一个翻译错误,所以我将它们更改为Action。所以,我的最后一个版本是:

代码语言:javascript
复制
template<typename T>
using Action = std::function<void(T obj)>;

template<typename T1, typename T2>
using Action = std::function<void(T1 arg1, T2 arg2)>;

template<typename T1, typename T2, typename T3>
using Action = std::function<void(T1 arg1, T2 arg2, T3 arg3)>;

但是这不能编译,因为Action已经定义了一个可以理解的错误(当到达第二个使用行时)。但是,有可能有带有重载的模板函数(同名,不同的模板参数),所以我想知道为什么我的别名模板不起作用。它是根本不支持还是我错过了什么?

另外,也许我没有完全理解协方差和逆反式,但在我看来,它们不适用于这个问题(这里不涉及类型继承),所以我看不出转换器工具想通过这些评论告诉我什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 07:30:11

JoachimPilebord不想回答,所以我这样做是为了完整。解决方案是使用这样的模板参数包

代码语言:javascript
复制
template<typename ... Ts>
using Action = std::function < void(Ts...) >;

它允许使用任意数量的参数定义回调函数。您也可以使用std::bind进行类似的操作,但是这样代码就更干净、更容易阅读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31229989

复制
相关文章

相似问题

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