C#到C++11的转换:委托模板
C# to C++11 conversion: delegate templates
我正在尝试将此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已经定义好了(当到达第二个使用行时(。然而,也有可能存在带有重载的模板函数(相同的名称,不同的模板参数(,所以我想知道为什么这不适用于我的别名模板。是根本不支持它,还是我错过了什么?
此外,也许我还没有完全理解协变和逆变,但在我看来,它们不适用于这个问题(这里不涉及类型继承(,所以我看不出转换器工具想通过这些评论告诉我什么。
template<typename ... Ts>
using Action = std::function < void(Ts...) >;
这允许用任意数量的参数来定义回调函数。您可以使用std::bind进行类似的操作,但这样代码更干净、更容易阅读。
相关文章:
- 如何将模板转换为C++11之前的模板
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何将Javascript正则表达式转换为C++11正则表达式
- 从c++11 time_t创建一个可转换为.net DateTime的字符串
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 从迭代器转换为变量的类型.(C++11 模板)
- C++11中的自动类型扣除和类型转换有什么区别
- 如何将元组转换为C 11中的字节数组
- C 11:为什么RVALUE参考参数隐式转换为LVALUE
- ISO C++11 不允许从字符串转换为字符
- 在 C++11 中将静态 constexpr 数组转换为模板参数
- 尝试将 C++11 代码转换为 C++03 时默认函数模板参数出错
- 将字符串元素转换为整数 (C++11)
- 对C 98和C 11的停止隐式转换
- C++11 何时相对于运算符优先级进行算术类型转换
- C++11自动.从float转换为long
- C 11中函数参数的显式模板函数参数规范和隐式转换
- C++11 unique_ptr和shared_ptr能够转换为彼此的类型吗?
- 如何在不提升的情况下将 C++11 代码转换为 C++98
- 转换基数 11 到十进制