2013-06-16 3 views
0

Я играю с вариационным макросом и шаблоном. Есть ли простой способ добиться следующего?C++ variadic macro and template

Это как std :: make_tuple. Как реализовать make_my_class? Я видел, что мне, вероятно, нужен «std :: decay», но я этого не совсем понимаю. Заранее большое спасибо.

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); 

Чтобы использовать VARIADIC аргументы макроса требует __VA_ARGS__, и я не знаю, как или, если вы можете передать, что decltype() так что вам нужно сделать что-то, что составит decltype(args)..., чтобы получить список типов 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); 
} 

Маленького объяснений: Это работает точно так же, как станд :: make_pair. make_my_class получает rvalue refs и переадресуется в my_class конструктор. Возвращаемое значение от make_my_class должно быть равно rvalue по умолчанию. Я думаю, что в таком методе построения должно быть нулевое накладные расходы.

Смежные вопросы