C#0x中的C#样式Action <T>,Func <T,T>等

Aus*_*yde 3 c# c++ lambda templates c++11

C#具有泛型函数类型,如Action<T>Func<T,U,V,...>

随着C++ 0x的出现以及具有模板typedef和可变参数模板参数的能力,似乎这应该是可能的.

对我来说显而易见的解决方案是:

template <typename T>
using Action<T> = void (*)(T);
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于仿函数或C++ 0x lambdas,除此之外,不会编译错误" expected unqualified-id before 'using'"

我的下一次尝试是使用boost :: function:

template <typename T>
using Action<T> = boost::function<void (T)>;
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,这也不能编译.

我唯一的另一个想法是STL样式模板参数:

template <typename T, typename Action>
void foo(T value, Action f) {
    f(value);
}
Run Code Online (Sandbox Code Playgroud)

但是这不提供强类型解决方案,并且仅与模板化函数相关.

现在,我将首先承认我不是C++,我更喜欢认为我是,所以很可能有一个我没有看到的明显解决方案.

是否可以在C++中使用C#样式泛型函数类型?

sth*_*sth 6

我认为语法应该是这样的:

template <typename T>
using Action = void (*)(T);
Run Code Online (Sandbox Code Playgroud)

尽管如此(g ++ v4.3.2)我也无法编译.

一般的STL样式函数模板在严格意义上不是强类型的,但它是类型安全的,因为编译器将确保模板仅针对满足函数的所有要求的类型进行实例化.具体来说,如果Action使用一个类型的参数无法调用,则会出现编译器错误T.这是一种非常灵活的方法,因为将Action实例化为函数或实现的某个类并不重要operator().

缺少模板化typedef的旧的非C++ 0x解决方法是使用带有嵌套typedef的模板化结构:

template <typename T>
struct Action {
   typedef boost::function<void (T)> type;
};

template <typename T>
void foo(T value, typename Action<T>::type f) {
    f(value);
}
Run Code Online (Sandbox Code Playgroud)