Boost :: MPL을 사용하여 템플릿 매개 변수와 문자열을 연결 한 typename을 생성하는 방법을 생각해 보려고합니다.템플릿 매개 변수를 문자열로 연결하여 C++ typename 생성
다음과 같은 클래스 쌍이 있습니다 : X
및 XProvider
. 후자는 이전 유형에서 상속 된 객체를 인스턴스화하는 팩토리 클래스입니다.
템플릿 클래스는 런타임시 유형의 인스턴스화를 관리하기위한 것이므로 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 + +의 템플릿,하지만 난 정말 경우 에서 모든 경우 가능하면 피하고 싶습니다.
정말 감사드립니다.
고맙다 - 쉬 무엘
매크로는, 미안 기존 결합하여 새로운 식별자를 만들 수있는 유일한 방법입니다. 템플릿으로 처리 할 수 없습니다. –
당신이 말하는 것은 나에게별로 의미가 없습니다. 'Get_provider_Type :: type'이라는 표현식을 사용하여 벡터의 템플릿 인수를 지정하려는 경우 유형을 제공하면됩니다. 이름을 생성 할 필요가 전혀 없습니다. –
pmr
아마도 _generate_는 잘못된 용어입니다. 'Plugin_Manager'는'std :: vector '을 포함 할 필요가 있습니다.''fooProvider'' 타입을 돌려 줄 메타 함수'Get_Provider_Type :: type'을 갖고 싶습니다만, 어떻게 해야할지 모르겠습니다. 이 메타 기능을 작성하십시오 (또는 가능하다면 @ MarkRansom의 위 주석에 따라). –