Шаблоны C++ и генерация кода для Variadic Sequence: как создать похожий блок кода для каждого аргумента / типа?

Интересно, можем ли мы иметь такой класс (псевдокод):

template <class Arg1T, ... class ArgNT>
class my_class
{
public:
    my_class(Arg1T Arg1, std::string Arg1_name  ... ArgNT  ArgN, std::string ArgN_name){}
};

И если бы мы могли автоматически генерировать функцию для каждого предоставленного типа аргумента во время компиляции, используя определения, например, чтобы получить что-то вроде (псевдокод):

template <class Arg1T, ... class ArgNT>
class my_class
{
public:
    my_class(Arg1T Arg1, std::string Arg1_name  ... ArgNT  ArgN, std::string ArgN_name){}
    // for each Arg we want to create a function like
    ArgMT   my_class_function(std::string name)
    {
       if(name == ArgM_name)
          return ArgM;
    }

};

Возможна ли такая / или немного похожая вещь в современном C++ и как ее создать?

Я хочу сказать следующее: я хочу генерировать функции для каждого типа класса, предоставляемого конструктору из некоторого шаблона функции. И интересно, как это сделать? Здесь показано, как повторить, но как повторить предоставленные классу аргументы и типы?

Я имел в виду, если бы мы знали количество аргументов шаблонного класса (N) мы могли бы создать N переменные разных типов (по одной на каждый аргумент) и N строки (все частные), и поэтому мы могли бы создать N функции для установщиков и получателей этого (строки + переменные) (которые мы бы назвали в конструкторе). Основная проблема здесь - как решить времена, когда вы получаете одни и те же типы дважды или больше, как получить количество аргументов из процессора boost.pre, как фильтровать одинаковые типы?

2 ответа

Я думаю, что в этом случае вы могли бы использовать интерфейсы и фабричный метод в целом.

Вы не можете перегружать функции только на основе типа возвращаемого значения, поэтому нет, это невозможно.

Если вы берете имена аргументов и my_class_function из картины, вы остались с std::tuple<T0, ..., Tn>, Ты можешь использовать std::get<N> чтобы получить N-й аргумент (но это полностью конструкция времени компиляции, N не может быть определена во время выполнения).

Если вам действительно нужна обработка во время выполнения, тогда сопоставьте std::string в boost::variant более N типов могут работать.

Другие вопросы по тегам