Как программно вызвать шаблонную функцию C ++ с различными типами данных? - PullRequest
2 голосов
/ 29 декабря 2011

В моей программе на C ++ мне нужно вызвать шаблонную функцию с различными типами данных (int, float, double, char и т. Д.) И запустить методы bar1(), bar2().

Как это сделать без необходимости явно писать вызов для каждого типа?

foo<int>::bar1()
foo<int>::bar2() 
foo<int>::bar3() 
...


foo<float>::bar1()
foo<float>::bar2() 
foo<float>::bar3() 
...

Ответы [ 5 ]

2 голосов
/ 29 декабря 2011

Поскольку в вашем примере они являются void функциями, можете ли вы переписать их так, чтобы типы можно было выводить? Как это:

template <class T>
void example(const T& v)
{
   // do something profound and meaningful here.
   foo<T>::bar1();
   foo<T>::bar2();
   foo<T>::bar3();
}

Теперь тип шаблона можно определить по аргументу, переданному в функцию:

int x = 0;
double y = 0;
bool b = false;
std::string s = "Hello";

example(x);
example(y);
example(b);
example(s);
1 голос
/ 29 декабря 2011

Я думаю, что это то, что вам нужно, если вы используете C ++ 11. Не знаю, как это сделать с C ++ 03.

template<typename Type>
void printAll()
{
    Foo<Type>::bar1();
    Foo<Type>::bar2();
    Foo<Type>::bar3();
}

template <typename Type, typename Type2, typename... RestTypes>
void printAll()
{
    printAll<Type>();
    printAll<Type2, RestTypes...>();
}


int main()
{
    printAll<int, double, float, string>();
    return 0;
}
1 голос
/ 29 декабря 2011

То, как вы разработали эти функции, типы должны быть определены в некоторой степени.Они не могут быть выведены.

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

template<typename T>
void do_it()
{
  foo<T>::bar1()
  foo<T>::bar2() 
  foo<T>::bar3()
}
0 голосов
/ 29 декабря 2011

Одним из решений является использование TypeLists. Взгляните на boost::mpl::vector, контейнер типов. Создайте рекурсивную функцию, которая принимает вектор типов в качестве параметра шаблона (или итератор такого вектора), а затем при каждом следующем вызове передает итератор к следующему типу.

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

Метапрограммирование

Создайте массив, в котором будут храниться все типы данных, которые вы хотите протестировать.Затем напишите цикл для вывода всех вызовов функций.Наконец, скомпилируйте и запустите этот сгенерированный код.

string types = ["int", "float", "char", "double"];
for(int j=0; j<4; ++j)
 for(int k=0; k<3; ++k)
  cout << "foo<" << types[j] << ">::bar" << k+1 << "();" << endl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...