Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 std::函数上的typedef将其缩短_C++11 - Fatal编程技术网

C++11 std::函数上的typedef将其缩短

C++11 std::函数上的typedef将其缩短,c++11,C++11,我想在我自己的名称空间中将std::function的类型缩短为func。这只是个人喜好 我尝试了下面的代码,但遇到语法错误 //MyHeader.hpp template<typename S> struct func; //signature template<typename R, typename ...Args> struct func<R(Args...)>; template<typename R, typename ...Args&g

我想在我自己的名称空间中将
std::function
的类型缩短为
func
。这只是个人喜好

我尝试了下面的代码,但遇到语法错误

//MyHeader.hpp
template<typename S> struct func; //signature

template<typename R, typename ...Args>
struct func<R(Args...)>;

template<typename R, typename ...Args>
//typename typedef std::function<R(Args...)> func; // <R(Args...)>;
using func = std::function<R(Args...)>;  //<---closes to solve.


//SomeClass.cpp
func<bool(int)> f;
func<void()> g = [] {
    //some code here...
}
//MyHeader.hpp
模板结构函数//签名
模板
结构函数;
模板
//typename typedef std::function func;//;

使用func=std::function// 您的解决方案有点太复杂了,您可能希望像这样使用

#include <functional>

template <class Fct> using func = std::function<Fct>;
#包括
使用func=std::function的模板;
您可以用所需的方式实例化:

int test(bool) { return 1; }

func<int(bool)> f(test);
funct<void()> g = [](){};
int测试(bool){return 1;}
func f(测试);
函数g=[](){};

它只是缺少了include?附加问题,
int(bool)
是被视为1个模板参数还是2个?函数有一个类型,当您将函数指针绑定到变量时,该类型将变得可见。lambda也有一个编译器已知的类型。因此,这里的实例化发生在一个类型上。这是一个很好的问题,我刚刚意识到,在别名签名中不需要可变模板。我运行了一个测试代码,它确认
int(bool)
只是一个模板参数。这也是一个使用func=std::function的解决方案
模板那是一样的:)编译器不在乎你选择哪个名字。我猜,如果
std::function
将来添加了额外的可选模板参数,可变版本是一个通用的解决方案。但目前看来,
std::function
只有一个模板参数。