2015-01-28 5 views
0

같은 튜플과 자신의 클래스 얻을 : 내 수업 복합에 대한표준 : 나는이 같은 클래스가 멤버

template<typename ... TTypes> 
class Composite { 
public: 
    std::tuple<TTypes...> &getRefValues() { return values; } 
private: 
    std::tuple<TTypes...> values; 
}; 

내가 std::get를 정의 할 수 있습니까? 기본적으로 private tuple 값으로 이미 정의 된 std::get을 호출해야합니다.

반환 유형이 알려진 경우 (예 : int 배열 멤버) 사용자 정의 get 함수를 구현할 수 있었지만 리턴 유형이 임의 유형 일 수있는 경우 실현 방법을 알지 못합니다. 구성 요소의 튜플 값 유형)?

+0

아니요, 안됩니다. 앱의 네임 스페이스에 정의해야합니다. –

+1

@RSahu : 왜 안 되니? "프로그램은 표준 라이브러리 템플릿에 대해 템플릿 전문화 을 추가 할 수 있습니다. 선언이 사용자 정의 유형에 따라 달라지는 경우에만"std' 네임 스페이스에 추가 할 수 있습니다. "(플러스 몇 가지 다른 조건). 그게 여기에 해당됩니다. –

+0

앱의 네임 스페이스에서 정의하더라도, 임의의 리턴 타입으로 get 메소드를 어떻게 구현할 수 있습니까? – moo

답변

1

당신은 할 수 있습니다

template <std::size_t I, typename... Ts> 
auto get(Composite<Ts...>& composite) 
-> decltype(std::get<I>(composite.getRefValues())) 
{ 
    return std::get<I>(composite.getRefValues()); 
} 

참고 : C++ 14에서는 -> decltype(..) 일부를 생략 할 수 있습니다.

+0

나는 그 동안에는 내 솔루션으로 그러나 어쨌든 고마워요. – moo

1

완벽을 기하기 위해 여기 내 해결책이 있습니다. 모두 감사합니다.

template<typename ... TTypes> 
class Composite { 
public: 
    Composite(TTypes... t) { 
     std::tuple<TTypes...> tuple(t...); 
     values = tuple; 
    } 

    std::tuple<TTypes...> &getRefValues() { return values; }  
private: 
    std::tuple<TTypes...> values; 
}; 

namespace std { 
template<size_t I, typename ... TTypes> 
    auto get(Composite<TTypes ...> &t) -> typename std::tuple_element<I, std::tuple<TTypes...>>::type { 
     return std::get<I>(t.getRefValues()); 
    } 
} 

int main() { 
    Composite<int, char, double> c(13, 'c', 13.5); 
    std::cout << std::get<0>(c) << std::endl; 
    std::cout << std::get<1>(c) << std::endl; 
    std::cout << std::get<2>(c) << std::endl; 

    return 0; 
} 
관련 문제