2014-12-04 6 views
1

Boost :: MPL을 사용하여 템플릿 매개 변수와 문자열을 연결 한 typename을 생성하는 방법을 생각해 보려고합니다.템플릿 매개 변수를 문자열로 연결하여 C++ typename 생성

다음과 같은 클래스 쌍이 있습니다 : XXProvider. 후자는 이전 유형에서 상속 된 객체를 인스턴스화하는 팩토리 클래스입니다.

템플릿 클래스는 런타임시 유형의 인스턴스화를 관리하기위한 것이므로 unordered_map 및 기타 기타 항목을 포함합니다. 회원. 클래스 Get_Provider_Type<T>는 유형 이름의 TProvider를 반환하는 metafunction입니다

template <typename T> 
class Plugin_Manager{ 

    using Base_Type = T; 

    std::vector<Get_Provider_Type<Base_Type>::type *> m_provider_collection; 

     */ ... /* 

}; 

을 감안할 때

: 나는 궁극적으로 달성하기 위해 노력하고 무엇

는 다음과 같이 보이는 metafunction이다. this answer을 바탕으로

, 나는 metafunction이의 라인을 따라 뭔가를 보여야한다고 생각 그러나

template < typename Str1, typename Str2 > 
    struct concat : boost::mpl::insert_range < Str1, typename boost::mpl::end<Str1>::type, Str2 > {}; 


    template <class T> struct Get_Provider_Type{ 
     typedef typename boost::mpl::string<boost::mpl::c_str<T>::value>::type Base_Name; 
     typedef boost::mpl::string<'Prov', 'ider'> Suffix; 

     typedef typename concat<Base_Name, Suffix>::type type; 
    }; 

, 정말 mpl::c_str 또는 mpl::string 또는 올바른 사용법을 이해하고 있지 않다, 나는 오류를 따라 갈 수 없어 내가받는 메시지. - 내가보다는 큰 매크로를 사용하는 경우 I 가능성이 작품을 만들 수 있다는 걸

error C2039: 'value_type' : is not a member of 'foo' 

(Plugin_Manager<foo> foo는 여기에 템플릿 인수 인) : 위의 작성된 코드는 나에게 오류 메시지를 제공합니다 C + +의 템플릿,하지만 난 정말 경우 에서 모든 경우 가능하면 피하고 싶습니다.

정말 감사드립니다.

고맙다 - 쉬 무엘

+1

매크로는, 미안 기존 결합하여 새로운 식별자를 만들 수있는 유일한 방법입니다. 템플릿으로 처리 할 수 ​​없습니다. –

+0

당신이 말하는 것은 나에게별로 의미가 없습니다. 'Get_provider_Type :: type'이라는 표현식을 사용하여 벡터의 템플릿 인수를 지정하려는 경우 유형을 제공하면됩니다. 이름을 생성 할 필요가 전혀 없습니다. – pmr

+0

아마도 _generate_는 잘못된 용어입니다. 'Plugin_Manager '는'std :: vector '을 포함 할 필요가 있습니다.''fooProvider'' 타입을 돌려 줄 메타 함수'Get_Provider_Type :: type'을 갖고 싶습니다만, 어떻게 해야할지 모르겠습니다. 이 메타 기능을 작성하십시오 (또는 가능하다면 @ MarkRansom의 위 주석에 따라). –

답변

2

글쎄, 당신은 템플릿 매개 변수와 문자열을 연결에서 유형 이름을 얻을 수 있지만, 당신의 의도 인 경우 ...

나는 metafunction을하고 싶습니다 당신은 단순히 foo의 유형을 정의 할 수 있습니다

나를 위해 돌아갑니다 Get_Provider_Type :: 형 타입 fooProvider :

당신이 그것을 필요로하는 경우에
struct foo { 
    using provider = fooProvider; 
}; 

, 당신은 유형을 정의 foo를 변경할 수없는 경우 유용 할 수 있습니다 T::provider

template<class T> 
struct Get_Provider_Type { 
    using type = typename T::provider; 
}; 

을 정의하는 모든 종류의와 함께 작동됩니다 "metafunction"를 구현할 수 있습니다. 그럼 당신은 대신 Get_Provider_Type를 전문으로 할 수 있습니다

template<> 
struct Get_Provider_Type<foo> { 
    using type = fooProvider; 
}; 
+0

감사. 왜 내가이 접근법을 전에 생각하지 않았는지 나는 모른다. 그것은 우아하고 (내 원래 게시물에 위의 의견에서 언급 한) 내 특정 응용 프로그램에 놀랍게 잘 작동합니다. 나는 내 마음이 mpl과 연결을 가진 솔루션을 찾는데 집중 해 있었기 때문에 이것이 나에게 일어나지 않았을 것입니다. 감사! –

+0

C++의 템플릿 시스템이 Turing-complete라고 생각 했나요? 그것은 그것을 할 방법이 있음을 암시하지 않습니까? –