Я играю с переменным макросом и шаблоном. Есть ли простой способ добиться следующего?
Это как 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);
Что не так с использованием шаблона функции?
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
объявить переменную соответствующего типа.
Вы можете сделать это так:
#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 по умолчанию тоже должно быть. Я думаю, что в таком методе построения не должно быть никаких накладных расходов.