std::visit
과 함께 std::bind
을 사용하여 방문자가 연결된 기능을 얻으려고합니다.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
이 모든 컴파일 할 수라고 선을 제거를 가지고 f
및 f2
을하고 싶습니다.
값을 얻기 위해'std :: get (s)'을 할 필요가 없습니다. 변형이 해당 유형을 보유하고 있는지 확인하려면 아마도'std :: holds_alternative (s)'을 (를) 사용 하시겠습니까? 마찬가지로 '이중'. –
Eljay
그렇게 생각하지 마십시오. 어디에서해야합니까? std :: visit은 내가 생각하는대로 처리해야합니다. – Bomaz
왜 람다 대신에'std :: bind'를 사용하고 싶습니까? C++ 1z의 최신 핫스팟과 언어의 람다 (lambdas)에 대한 필요성을 보여준 clunky old stuff를 혼합했습니다. – metal