如何在Visual Studio 2013中为函数类型创建类型别名?

时间:2014-10-13 21:32:50

标签: c++ c++11 visual-studio-2013

使用VS2013,我可以为函数类型创建一个typedef,如下所示:

typedef void ResponseCallback(std::string const&);

是否可以使用类型别名(我可以访问C ++ 11功能)来做同样的事情?我一直试图从使用typedef转移,因为using似乎更加一致。我尝试了类似下面的内容,但它不起作用:

using ResponseCallback = void (std::string const&);

我从Visual Studio 2013收到一条含糊不清的错误消息,如下所示:

  

错误C2061:语法错误:标识符'字符串'

3 个答案:

答案 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或函数指针。