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

C# to C++11 conversion: delegate templates

本文关键字:转换 C++11      更新时间:2023-10-16

我正在尝试将此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::函数。由于这是一个更大的项目,我使用了一个工具来完成所有的转换,这就是它所产生的:

#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已经定义好了(当到达第二个使用行时(。然而,也有可能存在带有重载的模板函数(相同的名称,不同的模板参数(,所以我想知道为什么这不适用于我的别名模板。是根本不支持它,还是我错过了什么?

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

JoachimPilebord不想回答,所以我这样做是为了完整性。解决方案是使用这样的模板参数包:
template<typename ... Ts>
using Action = std::function < void(Ts...) >;

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