使用VS2013,我可以为函数类型创建一个typedef,如下所示:
typedef void ResponseCallback(std::string const&);
是否可以使用类型别名(我可以访问C ++ 11功能)来做同样的事情?我一直试图从使用typedef
转移,因为using
似乎更加一致。我尝试了类似下面的内容,但它不起作用:
using ResponseCallback = void (std::string const&);
我从Visual Studio 2013收到一条含糊不清的错误消息,如下所示:
错误C2061:语法错误:标识符'字符串'
答案 0 :(得分:5)
然而你可以把它包起来。
template < typename P1 >
using ResponseCallback =
typename std::remove_pointer < void (*)( P1 const & ) >::type;
我在VS2013上进行了测试,然后是coliru
或者像这样的简单伪装包装也会满足VS2013:
template < typename functype >
struct functype_wrapper
{
typedef functype type;
};
//using ResponseCallback = void ( std::string const & ); // nope
using ResponseCallback = functype_wrapper < void ( std::string const & ) >::type; // oke
答案 1 :(得分:0)
我的问题的各种评论已经验证我正确使用了别名,这让我相信这可能是一个工具问题。我在Clang和GCC上测试了相同的别名,它运行得很好。因此,这必须是Visual Studio 2013中另一个不受支持/执行不佳的C ++ 11功能。
但我建议@Slyps为适用的解决方法提供优秀的答案。
答案 2 :(得分:0)
由于您有-std=c++11
可用,您可能希望使用较新的约定来实现此类功能。
#include <functional>
typedef std::function<void(std::string const &)> ResponseCallback;
这将允许您执行您尝试执行的操作,以及使用lambda,functor或函数指针。