2013-03-22 17 views
-1

내 문제는 더미 매개 변수를 사용하지 않고 템플릿 매개 변수를 추론하도록 컴파일러에 지시하는 방법을 알지 못한다는 것입니다. 여기컨테이너에 대한 템플릿 매개 변수 공제

template<int I, class C, class T, std::size_t N> 
inline typename std::enable_if< 
    std::is_same<C, std::array<T, N> >::value, 
    std::array<T, N> >::type 
create_container() 
{ 
    std::array<T, N> array; 
    // I is used somewhere 
    return array; 
} 

작업 예제 : 여기 휴무 예가 무엇 용기 C 지정 첫번째 예에서 인스턴스화

template<int I, typename T, std::size_t N> 
std::array<T, N> create_container(std::array<T, N> const&) // dummy parameter helps deduction 
{ 
    std::array<T, N> array; 
    // I is used somewhere 
    return array; 
} 

템플릿 파라미터이지만 제의 기능은 더미에 기초하여 선택되고 매개 변수. SFINAE 또는 다른 마술이 가능합니까? 부분 템플릿 전문화가 가능하지만 기능 템플릿에서는 불가능합니다.

create_container 는 다음과 같이 호출됩니다

template <std::size_t O, typename R, typename ...A, std::size_t ...I> 
inline R forward(R (*f)(A...), indices<I...>) 
{ 
    return (*f)(create_container<I + O, A>()...); 
} 
+1

어떻게 당신이 당신의'create_container()를 호출하는'때 더미 인수를 전달하지? –

+0

"작동 예제"가 정상적으로 작동합니까? 'typename N'은 꽤 틀린 것 같고, 인수가 단일 문자 대신 이름이라면 도움이 될 것입니다. –

+0

또한,'> :: type' 이후에 작동하지 않는 예제에서 여분의 꺾쇠 괄호가 있습니다. –

답변

2

방금 ​​C가 std::array<T,N> 여부를 감지하는 타입 특성을 누락? 그렇다면 :

template<typename> 
struct is_std_array : std::false_type {}; 

template< typename T, std::size_t N > 
struct is_std_array< std::array< T, N > > : std::true_type {}; 

template<int I, typename C> 
typename std::enable_if< is_std_array<C>::value, C >::type create_container() 
{ 
    C container; 

    // to access T and N from std::array<T,N>, use this: 
    typedef typename C::value_type T; 
    constexpr std::size_t N = container.size(); 

    // I is used somewhere 
    return container; 
} 
+0

함수의 본문에서 'T'와 'N'을 알아야합니다. – user1095108

+0

@ user1095108 : 수정 됨. –

+0

'typedef'와'const static' 멤버를 말하면서'is_std_array'를 어딘가에 T와 N을 저장하도록 바꿀 수 없습니까? – user1095108

관련 문제