2013-02-27 2 views
5

템플릿 속임수와 부스트 :: any가 모두 포함 된 라이브러리를 작성하고 있습니다. 나는 기본적으로이가 어디 상황으로 실행했습니다boost :: any and templates

boost::any a1, a2, a3, a4; 

을 ... 그리고 나는이처럼 보이는 함수를 호출해야합니다

template <typename A1, typename A2, typename A3, typename A4> 
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4); 

은 내가 음란 중첩 된 시리즈에 의존 수를 if 문은 10 개의 별개 유형을 처리한다고 가정하면 10,000 개의 if 문입니다! 부스트 전처리 기가 여기에 도움이 될 수 있지만 이것은 여전히 ​​끔찍한 해결책입니다.

이런 종류의 광기에 의지하지 않고 boost :: any의 내용으로 템플릿 함수를 호출하는 더 좋은 방법이 있습니까? 내가 말할 수있는 한, 존재하지 않는다.

+0

만 사용자를 :: any' 인스턴스는 런타임시에 정확한 값을 얻을 수 있습니다 (하드 코딩 된 타입을 제공합니다), 컴파일 타임에 유형이 지워 졌기 때문에'boost :: any'에 포함 된 값으로 그 함수를 호출 할 수 없습니다. 당신이 해결하려고하는 더 큰 문제는 무엇입니까? 'boost :: any'는 꽤 낮은 수준의 것들입니다. – GManNickG

+3

모든'any' 객체를 하나의 객체로 만들고 한번에 모두 설정하는 경우 정확한'somefunc' 인스턴스 ('& somefunc )에 대한 포인터도 안전하게 지정하십시오. – Xeo

+0

@GManNickG 내가 해결하려고하는 더 큰 문제는 한쪽에 루아 바인딩의 자동 생성과 부스트 :: 임의의 비동기 함수에서 결과를 보유하는 모든 것을 포함합니다. 이 상황에서는 둘 중 어느 것도 다른 것으로 대체 될 수 없습니다. – Xtapolapocetl

답변

10

모든 any 개체를 동시에 설정할 수 있으면 함수 포인터의 형식을 그곳에 하드 코딩 할 수 있습니다. 그것들을 모두 별도의 물건에 넣어두면 좋습니다. 이것은 type-erasure에 더블 테이크, 또한 (boost::any가 내부적으로 어떻게 작동하는지 등) 가상 함수를 통해 구현 될 수있다 기본적으로,하지만 난이 버전과 같습니다 :은`향상의

// note that this can easily be adapted to boost::tuple and variadic templates 
struct any_container{ 
    template<class T1, class T3, class T3> 
    any_container(T1 const& a1, T2 const& a2, T3 const& a3) 
    : _ichi(a1), _ni(a2), _san(a3), _somefunc(&somefunc<T1, T2, T3>) {} 

    void call(){ _somefunc(_ichi, _ni, _san); } 

private: 
    boost::any _ichi, _ni, _san; 
    // adjust to your need 
    typedef void (*func_type)(boost::any&, boost::any&, boost::any&); 
    func_type _somefunc; 

    template<class T1, class T2, class T3> 
    void somefunc(boost::any& a1, boost::any& a2, boost::any& a3){ 
    // access any objects with 'boost::any_cast<TN>(aN)' 
    } 
}; 
+0

훌륭해, 고마워. – Xtapolapocetl

+0

+1 특히 변수 _ichi, _ni 및 _san의 경우. –