2017-01-03 2 views
0

템플릿 함수의 소수를 사용하여 Foo 클래스가 있었고 각 유형을 해당 cpp 파일에 A, B, C 계열로 인스턴스화하려는 경우 현재 각각 하나,이 유형을 추가하거나 제거하려는 경우이 오류가 발생할 수 있습니다, 그리고 그것은 매번 업데이 트 성가신입니다. 도움이 될만한 매크로 트릭이나 메타 프로그래밍 기술이 있습니까? 같은일련의 템플릿 함수 또는 클래스를 인스턴스화하는 편리한 솔루션

뭔가 :

//Foo cpp 
template <typename T> 
T Foo::add(T t0, T 01) { 
    return t0 + t1; 
} 

INSTANTIATE_TEMPLATE(Foo::add, A, B, C) 

생성합니다 : 당신은 그 기능을 ODR-사용하여 기능과 템플릿 가변 도우미 기능을하고 인스턴스화 할 수

template A Foo::add<A>(A t0, A t1); 
template B Foo::add<B>(B t0, B t1); 
template C Foo::add<C>(C t0, C t1); 
+0

이 있습니까 전문화 완전히 다른

int Foo::add<int>(int, int); // instantiate for T = int double Foo::add<double>(double, double); // instantiate for T = double 

입니다 모든 인스턴스화는 동일합니까? 왜냐하면 그들은 당신이 각 유형별로 선언 할 필요가 없기 때문입니다. 각 유형에 대해 템플릿을 인스턴스화하는 편의 기능을 원한다면 구현은 동일해야합니다. – Kerndog73

+0

구현은 모두 동일하지만 (잘못된 경우 수정하십시오.) 라이브러리/외부에 사용하기 위해 이러한 방식으로 선언해야합니다. – Brian

+0

필요가 없습니다. 템플릿이 헤더 파일에있는 경우 처음 사용할 때 유형별로 인스턴스화됩니다. 따라서'Foo :: add add '은 그것이 호출되는 nomatter라고 처음 불릴 때 인스턴스화 될 것입니다. – Kerndog73

답변

0

, 같은 (당신이 할 수 가정 기본 구성 유형)

template <typename ... Ts> 
void add_instantiator(Foo& foo) 
{ 
    int dummy[] = {0, (static_cast<void>(foo.add<Ts>({}, {})), 0)...}; 
    static_cast<void>(dummy); // Avoid warning for unused variable 
} 

template void add_instantiator<A, B, C>(Foo&); 

또는 접기 식 있음 C++ 17 :

template <typename ... Ts> 
void add_instantiator(Foo& foo) 
{ 
    (static_cast<void>(foo.add<Ts>({}, {})), ...); 
} 
0

가 명시 적으로 템플릿의 인스턴스를 원하는 가정

template <typename T> 
T Foo::add(T t0, T t1) {return t0 + t1;} 

기술은이

template<> std::string Foo::add<std::string>(std::string x, std::string y) 
    {return y+x;}; 
    // assume we want add<std::string>() to append the first string to the second, 
    // not the second string to the first