Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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++ 如何将构造函数转换为std::函数_C++ - Fatal编程技术网

C++ 如何将构造函数转换为std::函数

C++ 如何将构造函数转换为std::函数,c++,C++,有没有办法将构造函数分配给像“f”这样的函数: struct C { C(int){}; }; 自动f=C::C(int);//不行 自动g=[](int){返回C(int());};//作品 C,C::C,&C,&C::C,C:&C,C::C(int),&C::C(int)。。。工作 周五派提出的解决方案: 模板 结构构造助手 { 模板 静态T&&构造(Args&&…Args) { 返回std::move(T(std::forward(args)…); } }; 自动f=ConstructH

有没有办法将构造函数分配给像“f”这样的函数:

struct C
{
C(int){};
};
自动f=C::C(int);//不行
自动g=[](int){返回C(int());};//作品
C,C::C,&C,&C::C,C:&C,C::C(int),&C::C(int)。。。工作

周五派提出的解决方案:

模板
结构构造助手
{
模板
静态T&&构造(Args&&…Args)
{
返回std::move(T(std::forward(args)…);
}
};
自动f=ConstructHelper::construct;//作品
自动c=应用(f,0);//作品

除了您编写的lambda之外,您尝试编写的代码遵循其他规则

在第一个函数中,您试图获取指向成员函数的指针:
&C::C
这类似于
&C::print
(假设参数int)此函数的第一个参数是指向C的指针,第二个参数是int

但是,我们正在尝试为构造函数执行此操作。所以我们没有一个有效的C。结果就是它根本无法编译

请注意,如果确实要在现有内存上执行构造函数,则需要新的位置

第二个代码是lambda。简而言之:实现了一个带有
操作符()
的类。在这个操作符中,您可以像在任何其他函数中一样编写代码,并通过值返回一个新构造的实例。(虽然,这看起来很像一个烦人的解析)它类似于执行前面提到的print函数


因此,两者都有不同的语义,而您的编译器未能编译此代码是正确的。

您尝试编写的代码遵循的规则不同于您编写的lambda

在第一个函数中,您试图获取指向成员函数的指针:
&C::C
这类似于
&C::print
(假设参数int)此函数的第一个参数是指向C的指针,第二个参数是int

但是,我们正在尝试为构造函数执行此操作。所以我们没有一个有效的C。结果就是它根本无法编译

请注意,如果确实要在现有内存上执行构造函数,则需要新的位置

第二个代码是lambda。简而言之:实现了一个带有
操作符()
的类。在这个操作符中,您可以像在任何其他函数中一样编写代码,并通过值返回一个新构造的实例。(虽然,这看起来很像一个烦人的解析)它类似于执行前面提到的print函数


因此,这两个函数都有不同的语义,而您的编译器未能编译此代码是正确的。

理论上,您假设的函数
apply
看起来就像一个模板一样简单

#include <iostream>
#include <type_traits>
struct C
{
    C(int){};
};

template <class F, class... Args>
auto apply ( F&& f, Args&&... args) -> typename std::result_of<F(Args...)>::type
{
    return f(args...);
}

float foo (int a, float b) {  return a*b; }

int main()
{
    auto b = apply(&foo, 3, 5.f);
    //auto b = apply(&C::C, 3);  //error: taking address of constructor 'C::C'

    return 0;
}

但最好避免这种情况,并重新考虑您心目中的任何元编程模式,即避免尝试为不同类型的参数调用相同的模板名称,或使用lambda进行修正。例如,您可以通过使用SFINAE避免调用
apply()

理论上,您假设的函数
apply
看起来就像一个模板一样简单

#include <iostream>
#include <type_traits>
struct C
{
    C(int){};
};

template <class F, class... Args>
auto apply ( F&& f, Args&&... args) -> typename std::result_of<F(Args...)>::type
{
    return f(args...);
}

float foo (int a, float b) {  return a*b; }

int main()
{
    auto b = apply(&foo, 3, 5.f);
    //auto b = apply(&C::C, 3);  //error: taking address of constructor 'C::C'

    return 0;
}

但最好避免这种情况,并重新考虑您心目中的任何元编程模式,即避免尝试为不同类型的参数调用相同的模板名称,或使用lambda进行修正。例如,您可以通过使用SFINAE避免调用
apply()

和/或的可能重复。您试图做的事情没有意义。@Eugene类似于
apply(func,args…
,我们应该在c++中使用
apply(cls,args…
您是在要求
分配器\u traits::construct
?但是:谁提供了构建
C
的内存位置?这就是它毫无意义的原因。构造函数既没有类型也没有地址,并且不能在函数调用表达式中显式调用。它不返回任何内容,甚至不返回
void
。和/或的可能重复。您尝试执行的操作没有意义。@Eugene类似于
apply(func,args…
,我们应该在c++中使用
apply(cls,args…
),您是在要求
分配器\u traits::construct
?但是:谁提供了构建
C
的内存位置?这就是它毫无意义的原因。构造函数既没有类型也没有地址,并且不能在函数调用表达式中显式调用。它不返回任何内容,甚至不返回
void
。因此,无法调用
apply
来构造C++11中的非默认可构造和非复制可构造类,即C(1,2,3)vs apply(某些构造函数函数,1,2,3)其中C是非默认可构造且非复制的-constructable@MidoriYakumo应该能够创建一个可移动的。通常,非默认、不可复制的类非常特殊。像单身人士或唯一授权人(例如
unique\u ptr
boost::scoped\u ptr
)@MidoriYakumo您的C是可复制的。但它不能移动。要不可复制,它必须有:
C(const C&)=delete
C(C&&o)
显式声明。它应该是可移动的或可复制的,或者上面的赋值将不起作用。因此,在C++11中,无法调用
apply
来构造一个非默认的可构造和非复制的可构造类,即C(1,2,3)vs apply(一些构造函数函数,1,2,3)其中C是非默认可构造且非复制的-constructable@MidoriYakumo应该能够创建一个可移动的。通常,非默认、不可复制的类非常特殊。像单身人士或唯一授权人(例如
unique\u ptr
boost::scoped\u ptr
)@MidoriYakumo您的C是可复制的。但它不能移动。要不可复制,它必须有:
C(const C&)=delete
C(C&&o)
显式声明。它应该是可移动的、可复制的或可分配的