C# C风格动作<;T>;,Func<;T、 T>;,C+中的etc+;0x

C# C风格动作<;T>;,Func<;T、 T>;,C+中的etc+;0x,c#,c++,templates,lambda,c++11,C#,C++,Templates,Lambda,C++11,C#具有通用函数类型,如Action或Func 随着C++0x的出现以及拥有模板typedef和可变模板参数的能力,这似乎是可能的 对我来说,显而易见的解决办法是: template <typename T> using Action<T> = void (*)(T); 出于同样的原因,这也不会编译 我唯一的其他想法是STL样式的模板参数: template <typename T, typename Action> void foo(T value, Ac

C#具有通用函数类型,如
Action
Func

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

对我来说,显而易见的解决办法是:

template <typename T>
using Action<T> = void (*)(T);
出于同样的原因,这也不会编译

我唯一的其他想法是STL样式的模板参数:

template <typename T, typename Action>
void foo(T value, Action f) {
    f(value);
}
模板
无效foo(T值,动作f){
f(价值);
}
但这并不提供强类型的解决方案,只与模板函数内部相关

<>现在,我将首先承认我不是C++ Wiz,我更倾向于认为我是,所以很可能有一个我没有看到的明显的解决方案。

C++中是否可能有C?型泛型函数类型?

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

template <typename T>
using Action = void (*)(T);

Gcc还不支持模板别名(请参阅),我不确定是否考虑了可变模板别名。我不认为其他编译器已经支持这个特性

我将只使用std::function或std::function而不是Action或Func


当然,你可以定义STD函数:函数的函数或FUNC函数,但是我看不出它的好处。

< P>我认为一般函数类型不是直觉C++,因为C++模板对泛型的作用不同。

C++是使用函数对象——任何可以放在代码> >代码>之后的编译器。这可以是一个函数指针,一个带有

操作符()
的类,等等。这是因为C++模板就像是华丽的宏,只要代码对类型替换有意义,你就可以了。

C泛型不起作用——它们更具限制性,可能是为了改进错误消息(因为C++模板错误在输出中是著名的冗长)。我对C#泛型了解不多,但我认为它们依赖于更像回调的东西,因此函数泛型很有用。

不,这是不可能的。不完全是。他们是不同的语言。问题是根据您的需要,最接近的近似值是什么。是否需要类型擦除,以便每个具有相同签名的函子都显示为相同的类型?如果是这样,你将不得不跳过一些障碍,并失去一些效率。通常,这是不值得的,因为由于模板和泛型之间的差异,这通常是不必要的。经常,但不总是。你到底需要什么?除了在C++中盲目尝试模仿C++
template <typename T>
using Action = void (*)(T);
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);
}