C#转换为C ++ 11:委托模板

时间:2015-07-05 11:45:42

标签: c# c++ templates c++11

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

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。由于这是一个较大的项目,我使用了一个工具来完成所有的转换,这就是它提出来的:

#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。所以,我的最终版本是:

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(当到达第二个使用行时)。但是,有可能让模板函数具有重载(同名,不同的模板参数),所以我想知道为什么这对我的别名模板不起作用。它根本不受支持还是我错过了什么?

另外,也许我没有完全理解共同和逆变,但在我看来它们不适用于这个问题(这里没有涉及类型继承),所以我看不到转换器工具想告诉我的是什么这些评论。

1 个答案:

答案 0 :(得分:1)

JoachimPilebord不想回答,所以我这样做是为了完整性。解决方案是使用这样的template parameter pack

template<typename ... Ts>
using Action = std::function < void(Ts...) >;

允许使用任意数量的参数定义回调函数。 Yould可以用std :: bind类似地做到这一点,但这样代码更清晰,更容易阅读。