2011-04-21 4 views
3

현재 구성 파일뿐 아니라 명령 행 옵션을 구문 분석하기 위해 boost :: program_options를 사용하기 시작했습니다.boost :: program_options를 자신의 템플릿 클래스와 함께 사용할 수 있습니까?

옵션 인수로 자체 템플릿 클래스를 사용할 수 있습니까? 즉, 내가 시맨틱 문제 ('값'에 대한 호출에 대한 일치하는 기능)을 받기를 컴파일하려고

#include <iostream> 
#include "boost/program_options.hpp" 

namespace po = boost::program_options; 

template <typename T> 
class MyClass 
{ 
private: 
    T* m_data; 
    size_t m_size; 
public: 
    MyClass(size_t size) : m_size(size) { m_data = new T[size]; } 
    ~MyClass() { delete[] m_data; } 
    T get(size_t i) { return m_data[i]; } 
    void set(size_t i, T value) { m_data[i] = value; } 
}; 

int main (int argc, const char * argv[]) 
{  
    po::options_description generic("General options"); 
    generic.add_options() ("myclass", po::value< MyClass<int>(2) >(), 
          "Read MyClass"); 
    return 0; 
} 

같은 것을 의미한다. 일반화 된 유형으로 일부 캐스팅을 제공해야하지만 실제 아이디어는 없습니다.

아무도 도와 줄 수 있습니까? 감사

Aeon512

답변

1

나는이처럼 작성합니다

MyClass<int> mine(2); 
generic.add_options() ("myclass", po::value(&mine), "Read MyClass"); 

를 다음 수행해야 할 모든이되어 다음과 같이 입력 스트림 연산자를 정의 :

std::istream& operator >>(std::istream& source, MyClass& target); 

을 그런 다음이 스트림을 호출합니다 프로그램 옵션을 부스트 운영자가 myclass 옵션을 사용할 때 해당 개체가 나중에 해당 옵션의 기능 중 하나를 호출하여 값을 추출 할 필요없이 해당 운영자의 구현에 따라 자동으로 채워집니다. 위의 구문을 선호하지 않는 경우

, 같은도 작동합니다 :

generic.add_options() ("myclass", po::value<MyClass<int> >()->default_value(MyClass<int>(2)), "Read MyClass"); 

당신이 클래스의 인스턴스를 생성 할 것이다이 방법을 직접 원하는 생성자 인수 템플릿 일부 경우 외부 런타임 동작은 허용되지 않습니다. 나는 장황하고 나중에 값을 변환하기 위해 더 많은 함수를 호출 할 필요가 있기 때문에이 방법을 선호하지 않습니다.

+0

힌트를 보내 주셔서 감사합니다. 그것은 완벽하게 작동합니다. – Aeon512

+0

굉장합니다. 내가 사용한 두 가지 아이디어 중 어느 것을 사용 했습니까? –

2

당신이에 템플릿 유형과 같은 개체를 전달하려고하기 때문에 부스트 :: program_options 당신이하려고하는 유스 케이스를 허용하는 경우 나도 몰라,하지만 당신은 점점 오류입니다 po :: value <>. 크기가 컴파일 타임에 알려졌다면 크기를 템플릿 매개 변수로 전달할 수 있습니다.

template< typename T, size_t size > 
class MyClass { 
    T m_data[size]; 
public: 
    // ... 
}; 

그리고 다음과 같이 사용 :

po::value< MyClass<int, 2> >() 

을 당신은 또한 당신이 구현하려고하는 것을 충족 추측하는 대신 Boost.Array를 사용하여 조사한다.

+1

+1, 오류 진단용. – rcollyer