gpt4 book ai didi

c++ - 对象的构造函数作为函数参数

转载 作者:行者123 更新时间:2023-11-30 03:15:20 25 4
gpt4 key购买 nike

我有一个函数,它引用一个对象并使用用户定义的函数复制它。我想将对象的复制构造函数作为此函数的默认值。是否可以?

template<class T>
void foo(T const & obj, std::function<T(T const &)> const & copy){
std::vector<T> iv;
size_t n=5;
for(size_t i=0U; i!=n; ++i){
iv.emplace_back(copy(obj));
}
//do stuff with iv
return;
}

最佳答案

您无法获得对复制构造函数(或与此相关的任何构造函数)的引用,但您可以将调用 c'tor 的对象创建包装在 lambda 中:

template<class T>
void foo(T const & obj, std::function<T(T const &)> const & copy = [](T const& t){ return T(t); }){
std::vector<T> iv;
size_t n=5;
for(size_t i=0U; i!=n; ++i){
iv.emplace_back(copy(obj));
}
//do stuff with iv
return;
}

然而,返回值优化将使它表现得好像您可以获得对复制 c'tor 的引用并调用它,而无需沿途复制太多。

您还可以通过更进一步的间接层摆脱另一个拷贝。由于 emplace_back 通过引用获取参数,因此 copy 返回的值需要提前具体化,并在 emplace_back 的实现中再次复制。如果您要传递另一个对象,一个可转换为 T 的对象,您可以保留另一个拷贝。我可以做如下

template<class T>
void foo(T const & obj, std::function<T(T const &)> const & copy = [](T const& t){ return T(t); }){

struct {
T const& obj;
std::function<T(T const &)> const & copy;
operator T() {
return copy(obj);
}
} obtainer{obj, copy};

std::vector<T> iv;
size_t n=5;
for(size_t i=0U; i!=n; ++i){
iv.emplace_back(obtainer);
}
//do stuff with iv
return;
}

obtainer 对象的引用被传递到 emplace_back 的内部,当需要创建新对象时,转换函数就会启动。我们可以期待RVO 现在消除所有拷贝,并在拷贝 c'tor 的帮助下就地构造新值。

关于c++ - 对象的构造函数作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com