2017-12-29 4 views
0

std::bindstd::visitを一緒に使用して、訪問者がバインドされている場所で機能を取得しようとしています。std :: bindをstd :: visitで使用する

「オーバーロードされた機能のインスタンスがありません」が表示されていますが、バインドに関して何が間違っているのかわかりません。

std::bindを利用して訪問者を獲得するにはどうすればよいですか?

#include <variant> 
#include <functional> 
#include <iostream> 

using Somenum = std::variant<uint64_t, double>; 

struct Visitor { 
    uint64_t operator()(const uint64_t& num) const { 
     return num; 
    } 
    uint64_t operator()(const double& num) const{ 
     return 5; 
    } 
}; 

int main(int argc, char **argv) { 
    const Somenum a = 3.0; 
    const Somenum b = (uint64_t)6; 
    const Visitor v{}; 
    const auto f = std::bind(std::visit<Visitor, Somenum>, v, std::placeholders::_1); 
    const auto f2 = [&v](Somenum x) { 
     return std::visit(v, x); 
    }; 

    std::cout << f(a) << std::endl << f(b)<< std::endl; 

    std::cout << f2(a) << std::endl << f2(b) << std::endl; 
    return 0; 
} 

効果的に私は、同じ動作fはすべてがコンパイルすることができますと呼ばれている行を削除

を持っているff2をしたいと思います。

+0

値を取得するために 'std :: get (s)'を実行する必要はありませんか? おそらく 'std :: possess_alternative (s)'は、バリアントがそのタイプを保持しているかどうかをチェックするでしょうか?同様に 'double'と同様です。 – Eljay

+0

そうは思わない。私はどこでそれをするべきですか? std :: visitは私が思っていることを処理することになっています。 – Bomaz

+0

ラムダの代わりに 'std :: bind'を使用したいのはなぜですか?最初の場所でラムダの必要性を示す手助けとなった古いものと、C++ 1zの最新の魅力をミックスしています。 – metal

答えて

4

私は<unresolved overloaded function type>エラーを説明できませんが、あなたのやっていることはとにかく間違っています。 std::visitは、転送の参照の束を取り、そうstd::visit<Visitor, Somenum>は、そのタイプのようなものである関数ポインタです:

decltype(auto)(*)(Visitor&&, Somenum&&); 

ものは右辺値参照です。しかし、あなたは実際にrvaluesでこの関数を呼び出すわけではありません。あなたはそれをlvaluesで呼び出すことになります。 const値も。あなたが望むバージョンは実際にstd::visit<Visitor const&, Somenum const&>です。これは動作します:

auto p = std::visit<Visitor const&, Somenum const&>; 
const auto f = std::bind(p, v, std::placeholders::_1); 

再び私はあなたがpを事前に宣言する必要がある理由はよく分かりません。


これは、lambdaを使用することが強く推奨される理由を明確にしています。テンプレートの引数の控除を手動で行う必要はありません。

関連する問題