如何在C++中绑定构造函数?

xml*_*lmx 12 c++ constructor bind

无需过度解释.以下代码不言而喻:

struct X
{
    X(int n){}
};

int main()
{
    std::vector<int> src;
    std::vector<X>   dest;

    // Below is not valid in current C++, but that is just what I want.
    transform(src.begin(), src.end(), back_insert(dest), std::bind(&X::X, _1)); 
}
Run Code Online (Sandbox Code Playgroud)

构造函数接受一些参数并返回构造函数的类的对象.

构造函数看起来像一个函数,就像一个函数,并且只是一个函数.

所以,我认为std :: bind应该统一处理构造函数和其他可调用对象.

但是,如何扩展功能模板"bind"来实现呢?

vis*_*tor 15

由于X是隐式可构造的int,因此简单的副本应该实现转换.

copy(src.begin(), src.end(), std::back_inserter(dest)); 
Run Code Online (Sandbox Code Playgroud)

甚至使用vector的构造函数:

std::vector<X>   dest(src.begin(), src.end());
Run Code Online (Sandbox Code Playgroud)

在一般情况下,boost的lambda库有一个constructor仿函数.

#include <boost/lambda/bind.hpp>
#include <boost/lambda/construct.hpp>
...
using namespace boost::lambda;
transform(src.begin(), src.end(), std::back_inserter(dest), bind(constructor<X>(), _1));
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,绑定可能不是必需的,因为构造函数只有一个参数.

  • 我很遗憾地看到这并没有解决`std :: bind`问题. (10认同)

Sim*_*one 6

我不知道是否有更酷的 Boost方式,但你可以这样写:

class Builder
{
    X operator() (int value) const { return X(value); }
};

transform(src.begin(), src.end(), back_insert(dest), Builder()); 
Run Code Online (Sandbox Code Playgroud)

  • 如果它们起作用,我无法看到*琐碎的*解决方案有什么问题.我们总是需要写复杂的东西吗? (4认同)