C ++ вариационный макрос и шаблон

Я играю с переменным макросом и шаблоном. Есть ли простой способ добиться следующего?

Это как 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);

0

Решение

Что не так с использованием шаблона функции?

    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() так как вам нужно сделать что-то, что составит decltype(args)... чтобы получить список типов args, Шаблон функции обходит все это с помощью неявного вывода шаблона и auto Ключевое слово означает, что вам не нужно знать, какие типы передаются my_class объявить переменную соответствующего типа.

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 ссылки и пересылку в мои занятия конструктор. Возвращаемое значение из make_my_class по умолчанию тоже должно быть. Я думаю, что в таком методе построения не должно быть никаких накладных расходов.

2

По вопросам рекламы [email protected]