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

标签 c++ constructor binding

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

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/

相关文章:

C++ 传递对象的拷贝还是传递指向对象的指针?

c++ - 新构造函数抛出异常后的对象指针状态 - C++

silverlight - 如何使用反射获取 Silverlight 中具有 ContentProperty 的控件的 BindingExpression(和值)

wpf - 在 WPF 中使用 Multibinding 时是否必须使用转换器?

c++ - navicat之类的数据库管理软件如何从表中选取大量数据

c# - C++ 将 UTF 字节数组转换为字符串

c++ - 从 std::exception 派生的类在 what() 上抛出无效指针错误

c++ - GCC 下的 2 字节 (UCS-2) 宽字符串

java - 不同类的 Swing 组件

java - 如何从JavaFX中的二级线程获取更新消息/属性?