【发布时间】:2010-04-22 03:50:17
【问题描述】:
C# 具有通用函数类型,例如 Action<T> 或 Func<T,U,V,...>
随着 C++0x 的出现以及拥有模板 typedef 和可变参数模板参数的能力,这似乎应该是可能的。
对我来说显而易见的解决方案是:
template <typename T>
using Action<T> = void (*)(T);
但是,这不适用于仿函数或 C++0x lambda,除此之外,编译时不会出现错误“expected unqualified-id before 'using'”
我的下一个尝试可能是使用 boost::function:
template <typename T>
using Action<T> = boost::function<void (T)>;
出于同样的原因,这也无法编译。
我唯一的其他想法是 STL 样式模板参数:
template <typename T, typename Action>
void foo(T value, Action f) {
f(value);
}
但这并没有提供强类型的解决方案,并且只在模板化函数内部相关。
现在,我将第一个承认我不是我更愿意认为自己是的 C++ 专家,所以很可能有一个我没有看到的明显解决方案。
是否可以在 C++ 中使用 C# 风格的泛型函数类型?
【问题讨论】:
-
不,这是不可能的。不完全的。它们是不同的语言。问题是最接近的近似值是什么,根据您的需要。您是否需要类型擦除,因此具有相同签名的每个仿函数都显示为相同类型?如果是这样,您将不得不跳过一些障碍,并失去一些效率。而且通常不值得这样做,因为由于模板和泛型之间的差异,它通常不是必要的。经常,但并非总是如此。你到底需要什么?除了一味地试图在 C++ 中模仿 C#
标签: c# c++ templates lambda c++11