C#到C++;11转换:代理模板

C#到C++;11转换:代理模板,c#,c++,templates,c++11,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); 但这并没有编译,可以理解的错误是动作已经定义(当到达第二行时)。但

我正在尝试将此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);
但这并没有编译,可以理解的错误是动作已经定义(当到达第二行时)。但是,有可能会有带有重载的模板函数(相同的名称,不同的模板参数),所以我想知道为什么这不适用于我的别名模板。它是不受支持还是我错过了什么


另外,也许我没有完全理解协方差和逆变,但我认为它们不适用于这个问题(这里没有涉及类型继承),因此我不明白转换工具想通过这些评论告诉我什么。

JoachimPilebord不想回答,所以我这样做是为了完整性。解决方案是使用以下类似的方法:

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

它允许使用任意数量的参数定义回调函数。YUDE可以类似于STD::Boin,但是这样代码更干净,更容易阅读。

使用<代码>使用< /Cord>关键字,您可以创建一个类型的别名,C++不允许重载类型(即,不能有两个不同类型的同名)。也许可以用?@JoachimPileborg解决,你的暗示一针见血。解决方案是:
使用Action=std::function的模板。你能把你的提示作为答案贴出来吗,这样我就可以接受它并获得分数了?很有意思的是,为什么人们对一个完全有效且好的问题投了反对票,甚至没有注意解释原因。如果缺乏知识是向下投票的标准,那么SO的所有问题都会有负面投票计数。在C#中,使用“In”关键字指定一个逆变类型参数-因为这是您在C#代码中使用的,所以注释是适当的。
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)>;
template<typename ... Ts>
using Action = std::function < void(Ts...) >;