読者です 読者をやめる 読者になる 読者になる

コンストラクタをbindしたりとかで使うConstruct

C++

ふとstd::bindでコンストラクタをbind出来ないかと思いまして

using namespace std::placeholders;
    struct X{
        X(int x, std::string s){ }
    };

    std::bind(X, 3, _1);//出来ない
    std::bind(X::X, 3, _1);//出来ない
    std::bind(static_cast<X(int x, std::string s)>(X), 3, _1);//できねーよ
    std::bind(static_cast<X(int x, std::string s)>(X::X), 3, _1);//できねえって

 出来ない。コンストラクタはグローバル関数でない

そこでとりあえずコンストラクタを関数でラッパしてみようとする

template<class T,class ...Arg>
T Construct(const Arg&...x){
    return T(x...);
}

 

auto func=std::bind(Construct<X>,3,_1);
auto x=func();

 今度はうまくいきそうだが……

エラー    1    error C2512: 'main::X::X' : クラス、構造体、共用体に既定のコンストラクターがありません。

どういうことかというとConstruct<X>がT(int,std::string)ではなく

T()を呼びだしている、ということらしい。言われてみればそりゃそうだ

回避法はConstruct<X,int,std::string>とちゃんと書くことである。うへー

 

しかしこれに関してはbindの(っていうかC++の)仕様なので諦めよう。うへー

プレースメントを使わないのならこういう関数も使えるかもしれない

template<class T, class ...Arg>
auto ConstructerBind(const Arg&...x)->decltype(std::bind(Construct<T, Arg...>, x...))
{
    return std::bind(Construct<T,Arg...>, x...);
}

bind 後置宣言 可変長template……C++11の見本市のような関数である

ぶっちゃけ今ラムダ式あるからどーでもいいといえばどーでもいい話