2013-06-16 3 views
0

가변 매크로 및 템플릿을 가지고 놀고 있습니다. 다음을 달성하기위한 간단한 방법이 있습니까?C++ 가변 매크로 및 템플릿

std :: make_tuple과 같습니다. make_my_class를 구현하는 방법? 나는 아마도 "std :: 붕괴"가 필요하다는 것을 알았지 만 나는 그것을 이해하지 못했다. 많은 감사드립니다.

template <typename... Args> 
class my_class 
{ 
public: 
    my_class(Args... args) 
     : items_(args...) 
    { 
    } 

private: 
    std::tuple<Args...> items_; 
}; 

// How to fix this line? 
#define CREATE_MY_CLASS(var_name, args...) my_class<decltype(args...)> var_name(args...); 

// Usage: 
// CREATE_MY_CLASS(xyz, 1, 2, 3) 

// Target: 
// my_class<decltype(1), decltype(2), decltype(3)> xyz(1, 2, 3); 

답변

2

함수 템플릿 사용시 문제점은 무엇입니까?

template <typename ... Args> 
    my_class<Args...> get_my_class(Args&&...args) 
    { 
     return my_class<Args...>(std::forward<Args>(args)...); 
    } 

    auto x = get_my_class(1,2,3,4,5,6); 

__VA_ARGS__을 필요로하는 매크로의 가변 인수를 사용하고 난 당신의 형식의 목록을 가져올 수 decltype(args)... 금액 무언가를 할 필요가 있기 때문에 당신이 decltype()에 그 전달 방법이나 알고하지 않습니다 args. 함수 템플릿은 암시적인 템플릿 공제와 함께 모든 템플릿을 무시하고 auto 키워드는 적절한 유형의 변수를 선언하기 위해 my_class에 전달되는 형식을 알 필요가 없음을 의미합니다.

+0

완벽한 전달을 사용하는 것이 좋습니다. – juanchopanza

+0

@ juanchopanza, 물론 그렇습니다. – SirGuy

2

당신은 이런 식으로 작업을 수행 할 수 있습니다

#include <iostream> 
#include <tuple> 
#include <utility> 

// my_class declaration 
// ... 


template <typename... Args> 
my_class<Args...> make_my_class(Args&&... args) { 
    return my_class<Args...>(std::forward<Args>(args)...); 
} 

int main() { 
    auto f = make_my_class(1,2); 
} 

리틀 explaination를 :이 표준 : make_pair과 동일한 방식으로 작동합니다. make_my_class은 rvalue refs를 받고 my_class 생성자로 전달됩니다. 의 반환 값 make_my_class도 기본적으로 rvalue 여야합니다. 그러한 구축 방법에는 제로 오버 헤드가 있어야한다고 생각합니다.