2017-09-27 6 views
1

어떤 이유인지 부스트의 변형을 사용하고 있습니다. (저는 C++ 17 버전이 있습니다. 여기에 이전 버전과의 호환성을 제공하고 있으며, C++ 17은 clang ++에서 완전히 지원하지 않습니다). 방문자 패러다임을 사용하여 :3 args를 지원하지 않는 변형 apply_visitor를 얻는 방법?

이 인수를 예상대로 13 출력

#include <iostream> 
#include <boost/variant.hpp> 

using boost::variant; 

typedef boost::variant<double, std::string> term_t; 

class plus_visitor : public boost::static_visitor<term_t> { 
public: 
    term_t operator()(double lhs, double rhs) const{ 
     return {lhs + rhs}; 
    } 
    term_t operator()(double lhs, std::string rhs) const{ 
     return {lhs + std::stoi(rhs)}; 
    } 
    term_t operator()(std::string lhs, int rhs) const{ 
     return operator()(rhs, lhs); 
    } 
    term_t operator()(std::string lhs, std::string rhs) const{ 
     return std::stoi(lhs) + std::stoi(rhs); 
    } 
}; 

int main(){ 
    // term_t lhs {3.0}; 
    term_t rhs {"10"}; 
    term_t lhs {"3"}; 
    term_t res = boost::apply_visitor(plus_visitor(), lhs, rhs); 
    std::cout << res << std::endl; 
    return 0; 
} 

작동합니다.

3 인수 거래는 여기에 무엇

#include <iostream> 
#include <boost/variant.hpp> 

using boost::variant; 

typedef boost::variant<double, std::string> term_t; 

class plus_visitor : public boost::static_visitor<term_t> { 
public: 
    term_t operator()(double lhs, double rhs, double x) const{ 
     return {lhs + rhs + x}; 
    } 
    term_t operator()(double lhs, std::string rhs, double x) const{ 
     return {lhs + std::stoi(rhs) + x}; 
    } 
    term_t operator()(std::string lhs, double rhs, double x) const{ 
     return operator()(rhs, lhs, x); 
    } 
    term_t operator()(std::string lhs, std::string rhs, double x) const{ 
     return std::stoi(lhs) + std::stoi(rhs) + x; 
    } 
}; 

int main(){ 
    term_t rhs {"10"}; 
    term_t lhs {"3"}; 
    term_t x {3.0}; 
    term_t res = boost::apply_visitor(plus_visitor(), lhs, rhs, x); 
    std::cout << res << std::endl; 
    return 0; 
} 

폭발? apply_visitor은 2 개의 인수에 대해서만 작동합니까?

진단

나는 문서를보고, 그 발견 :

이진 인수 또는 단항 인수 http://www.boost.org/doc/libs/1_36_0/doc/html/boost/apply_visitor.html

apply_visitor 작품! 이거 끔찍해! 이 문제를 해결하고 구문에서 완전히 추악하지 않고 3 번째를 제공하려면 어떻게해야합니까? 더 많은 입력을 허용하는 다른 boost 라이브러리 함수가 있습니까? 부스트 라이브러리가 임의의 크기의 apply_visitor 함수를 허용하기 위해 가변 템플릿을 사용하지 않는 이유는 무엇입니까?

+0

BTW, 3 번째 매개 변수가'std :: string' 인 것들을 잊어 버렸습니다. – Jarod42

+0

@ Jarod42 알아요. 나는 여기서 한 점을 증명하려고 노력하고있다. – OneRaynyDay

+0

증명 된 점. 부스트를 사용하려면 제한 사항을 처리해야합니다. 두 개 이상의 인수가 필요한 경우, 원하는만큼의 값을 포함하는 단일 구조로 대체하십시오. –

답변

2

부스트 1.36에 대한 설명서는 released in 2008입니다. 당신이 documentation for the current release 보면, 그것은 다음에게 문서는 세 개 이상의 피연산자를 수용

과부하가의 내용에 주어진 방문자의 함수 호출 연산자를 호출 상태

template<typename MultiVisitor, typename Variant1, typename Variant2, 
     typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor(MultiVisitor & visitor, Variant1 & operand1, 
       Variant2 & operand2, Variant3 & operand3, ... other_operands); 
template<typename MultiVisitor, typename Variant1, typename Variant2, 
     typename Variant3> 
    typename MultiVisitor::result_type OR decltype(auto) 
    apply_visitor(const MultiVisitor & visitor, Variant1 & operand1, 
       Variant2 & operand2, Variant3 & operand3, ... other_operands); 

apply_visitor 오버로드

을 나열 지정된 피연산자. ... 해당 기능은 실제로 헤더에 정의되어 있습니다. boost/variant/multivisitors.hpp ... 다중 방문자를 사용하려면 해당 헤더를 수동으로 포함시켜야합니다.

그래서 당신은, 최근 부스트 릴리스를 사용하여 관련 헤더를 포함하고 있는지 확인, 3 인자, 예를 들어 누락 된 operator() 과부하를 정의하고 코드를 컴파일해야한다.

+0

알게되었습니다. 고맙습니다! 나는 그들이 이것을 조금 더 분명하게 보이기를 바란다. 또한,이 부스트 lib에서 오류 메시지를 읽는 것은 매우 어렵습니다. :( – OneRaynyDay

+0

@OneRaynyDay 구글은 최신 부스트 릴리스 문서를 설정,하지만 당신은 오래된 문서에서 찾고 있다면, 당신은 최신 버전을보고하지 않을 말한다 상단에 노란색 상자가있을 것입니다 거의 검색하지 않고 링크가 최신 문서의 경우 (링크가 끊긴 경우도 있지만 :)) – Praetorian