Шаблоны 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 типов могут работать.