2011-11-28 3 views
2

좋아, 이건 내 컴파일러 (vs2008)에서 작동하지만 내가 뭔가 비표준 일을하는지 알아 내려고하고있어. 나는 to_array 어댑터가 실제로 당신이 그것으로 전달하는 인수를 사용하지 않는다는 사실 주위에 바람을 피우고있어boost.assign으로 초기화 된 익명 tr1 배열 반환

std::tr1::array<int, 3> OneTwoThree() { 
    return boost::assign::list_of(1)(2)(3).to_array(std::tr1::array<int, 3>()); 
} 

, 그냥 유형을 파악하는 데 사용하고 : 여기에 내가 뭘하는지 사소한 예입니다.

std::tr1::array<int, 3> a = boost::assign::list_of(1)(2)(3).to_array(a); 

어떤 아이디어 단지는 산뜻한입니다 to_array에 값 초기화 배열을 던지는 여부에 : 예는, 그러나, 더 같이 사용 보여? 이 작업을 수행하는 더 깨끗한 방법이 있습니까?

답변

3

to_... 멤버 함수 모든하지만 불필요하게, 반환 형식이 안전으로 당신이 원하는 동일한 유형의 값을 초기화 인스턴스를 전달에만 네 그래서, 템플릿 인수 공제와 지원의 목적에 대한 인수를 무능한.

그러나 to_... 멤버 함수는 템플릿 변환 연산자를 제대로 지원하지 않는 컴파일러를 지원하기 위해서만 존재합니다. 왜 처음에 템플릿을 사용하고 있습니까? 깨끗한 구문은 단순히 것이다 : 나는 std::tr1::array<>보다는 여기 boost::array<>을 사용했습니다

boost::array<int, 3> OneTwoThree() { 
    return boost::assign::list_of(1)(2)(3); 
} 

참고; 그 이유는 Boost.Assign 라이브러리가 TR1/C++ 11 표준 라이브러리에 대한 지식이 없으므로 std::array<> 또는 std::tr1::array<>을 적절히 전문화하지 못했기 때문입니다. 이 전문 자신을 추가하고, 결과적으로 std::tr1::array<>에 위의 코드를 작동하게하려면 Boost.Assign의 헤더를 포함 뒤에 다음 코드 를 추가

namespace boost { namespace assign_detail { 

template<typename T, std::size_t sz> 
type_traits::yes_type assign_is_array(std::tr1::array<T, sz> const*); 

}} 

(참고 : 부스트 1.48 테스트, 이전 버전이 필요할 수 있습니다 다른 전문.)


- 건설 기본되지 않은 질문의 구문은 값 초기화합니다.

+0

오른쪽, 나는 tr1 :: array에 대한 지원 부족을 해결하기 위해 to_array 멤버를 사용하고있었습니다. 나는 당신이 대신 제안한 전문화와 함께 갈 것입니다, 감사합니다. 값 초기화를위한 편집 된 질문. –