2011-12-03 4 views
3

구성 파일에서 일부 값을 다시로드하고 싶습니다. 나는 variables_map에 존재한다면 po::store 값을 변경하지 않을 것입니다. 이미 존재하는 값을 대체하는 대안이 있습니까?boost :: program_options 값을 다시로드하는 방법

variables_map에서 다시로드하려는 값을 삭제하려고 시도했지만 po::store은 이전 값에 액세스 할 수 없더라도 새 값을 추가하지 않습니다.

답변

4

문제는 변수 맵이 어떤 옵션이 최종인지 기억하는 것입니다. 소스를 보면 다음과 같은 항목이 있습니다.

/** Names of option with 'final' values -- which should not 
    be changed by subsequence assignments. */ 
std::set<std::string> m_final; 

variables_map의 개인 회원 변수입니다.

가장 쉬운 방법은 새로운 variables_map을 사용하고 이전 것을 대체하는 것입니다. 일부 이전 값이 필요하거나 일부 값만 바꾸려면 자체 저장 함수를 작성하십시오. 기본적으로 po :: store를 사용하여 임시 variables_map을 만든 다음 필요한 방식으로 variables_map을 업데이트합니다.

variables_map은 기본적으로 std :: map이므로 동일한 방식으로 해당 내용에 액세스 할 수 있습니다. 포 네임 스페이스 별칭이다 : 그것은 포 :: VARIABLE_VALUE, 어떤 object.If 방금 당신이

template<class T> 
void replace( std::map<std::string, po::variable_value>& vm, const std::string& opt, const T& val) 
{ 
    vm[option].value() = boost::any(val); 
} 

주 같은 것을 사용할 수있는 단일 값을 대체 할 :: 부스트 주위 종류의 래퍼를 저장합니다.

namespace po = boost::program_options; 
+0

위의 내용이 구문 적으로 체크 아웃하지 않았기 때문에 약간의 수정으로 함수가 잘 작동했습니다. 템플릿 void modify_variable_map (std :: map & vm, const std :: string & opt, const T & val) {vm [opt] .value() = boost :: any (val); } –

3

P3trus의 솔루션에는 다운 캐스트가 포함됩니다. variables_mapstd::map::operator[]const variable_value & (const 재 할당을 방지)을 오버로드하므로이 작업이 필요합니다.

그러나 C++ 11에서 우리는 과부하되지 std::map::at()을 가지고, 그래서 할 수 있습니다 : 필요한 직접

vm.at(option).value() = val; 

합니다.