在std::transform中将构造函数用作函数的最佳方法? 我试图指定构造函数作为最后一个转换参数,但它不起作用,因为在C++中,你不能使用构造函数的地址,而且签名也不匹配,构造函数没有返回值。

在std::transform中将构造函数用作函数的最佳方法? 我试图指定构造函数作为最后一个转换参数,但它不起作用,因为在C++中,你不能使用构造函数的地址,而且签名也不匹配,构造函数没有返回值。,c++,stl,c++20,C++,Stl,C++20,我可以很容易地把它用lambda包起来,但我想知道有没有更简单的方法呢? 构造函数functor看起来不太糟糕,但它不在std::中,我更喜欢某种标准的方法(我查看了std::allocator::construct,但签名不匹配) 以下是我的: #包括 #包括 #包括 #包括 #包括 结构广场{ 显式平方(const int a):a(a){ INTA; }; 模板 结构构造函数{ 模板 T运算符()(Args&&…Args){ 返回T(标准:正向(参数)…); } }; int main()

我可以很容易地把它用lambda包起来,但我想知道有没有更简单的方法呢? 构造函数functor看起来不太糟糕,但它不在
std::
中,我更喜欢某种标准的方法(我查看了
std::allocator::construct
,但签名不匹配)

以下是我的:

#包括
#包括
#包括
#包括
#包括
结构广场{
显式平方(const int a):a(a){
INTA;
};
模板
结构构造函数{
模板
T运算符()(Args&&…Args){
返回T(标准:正向(参数)…);
}
};
int main(){
std::向量int{1,2};
向量平方;
//:(无法获取构造函数的地址)
//std::transform(ints.begin()、ints.end()、std::back\u插入器(正方形)和Square::Square);
//:/工作,但需要手动实现构造函数
std::transform(ints.begin()、ints.end()、std::back_插入器(squares)、构造函数{});
//:/工作,但垃圾
//std::transform(ints.begin()、ints.end()、std::back_插入器(squares),[](常量int i){返回squares(i);});
用于(常数自动平方:平方){

std::cout将我们局限于标准的C++20工具,我建议只使用向量构造函数作为迭代器(这可能需要调整
Square
的构造函数,如下所述):


std
中没有任何内容。你的模板还不错。我只是把它放在一个小的实用程序库中。如果
std::ranges::transform(ints,std::back_inserter(squares));
能自动工作就好了@康桓瑋 - 不能使用
back\u inserter
,但可以执行类似
std::ranges::copy(ints,util::back\u emplacer(squares));
(参见示例)。关键是
运算符=
。标准的反向插入器需要对象引用,因此需要复制初始化,但c'tor是显式的。
emplace
的有限应用程序可以做到这一点。如果构造函数不是显式的,
ranges::to
将在此处工作:@metalfox感谢您将其移动到一个更高的位置
#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>
#include <vector>

struct Square{
    explicit Square(const int a):a(a){}
    int a;
};

int main() {
  std::vector<int> ints{1,2};
  std::vector<Square> squares(ints.begin(), ints.end());

  for (const auto square:squares){
      std::cout << square.a << std::endl;
  }
}
#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>
#include <vector>
#include <range/v3/all.hpp>

struct Square{
    /*explicit*/ Square(const int a):a(a){}
    int a;
};

int main() {
  std::vector<int> ints{1,2};
  std::vector<Square> squares = ints | ranges::to<std::vector<Square>>();

  for (const auto square:squares){
      std::cout << square.a << std::endl;
  }
}