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

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

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 ]

0 голосов
/ 10 декабря 2011

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

0 голосов
/ 02 декабря 2011

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

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

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

...