конкретный вопрос синтаксиса - PullRequest
0 голосов
/ 12 января 2011


Можно ли создать шаблон для инициализации вроде:

template <typename C> typename C::value_type  fooFunction(C& c) {...};
std::vector<string> vec_instance;
fooFunction(cont<0>(vec_instance));
fooFunction(cont<1>(vec_instance));

В целом меня интересует, возможно ли указать шаблон, используя целое число (то есть 0) вместо истинного имени типа. И как добиться выше?

Ответы [ 3 ]

1 голос
/ 12 января 2011

Мне не совсем понятно, о чем вы спрашиваете, но у меня работает следующий фрагмент:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename C>
typename C::value_type  fooFunction(const C & c) { return 0; };
/* note that fooFunction takes a ref-to-const, not a reference  */ 

template<int N>
struct cont
{
public:
   typedef int value_type;
   cont(vector<string> vec) {};
};

int main()
{
std::vector<string> vec_instance;
fooFunction(cont<0>(vec_instance));
fooFunction(cont<1>(vec_instance));
}

Два изменения стоит отметить:

  1. Целое число не является типом, поэтому, если продолжение объявлено template <typename T>, написанное вами не будет работать. template <int N> - это правильный способ параметризации целочисленного значения, как упоминалось в templatetypedef.

  2. Я не уверен, как определяется cont<>, но из вашего использования это должен быть объект, который вы строите как временный. У вас возникнут проблемы с передачей этого временного значения в качестве ссылки в fooFunction. Обратите внимание, что мой пример выше передает C как reference-to-const.

0 голосов
/ 12 января 2011

Это то, что вы после? Нетипичные параметры шаблона:

template<int n> class Cont
{
public:
    typedef int value_type;
};

template<>
class Cont<0>
{
public:
        typedef double value_type;
        value_type convert(const std::string& s) const
        {
            return atof(s.c_str());
        }
};

template<>
class Cont<1>
{
public:
        typedef long value_type;
        value_type convert(const std::string& s) const
        {
            return atoi(s.c_str());
        }
};

template <int n> typename Cont<n>::value_type  fooFunction(const Cont<n>& cont, const std::string& s)
{
    return cont.convert(s);
}
void test()
{
    Cont<0> c0;
    Cont<1> c1;
    double d = fooFunction(c0,"1.0");
    int i = fooFunction(c1, "-17");
}
0 голосов
/ 12 января 2011

Да, вы можете параметризовать шаблоны по нетипичным аргументам, таким как целые числа, указатели и другие шаблоны.Например:

template <typename T, int N> struct Array {
    T data[N];

    /* ... other functions ... */
};

Эти шаблоны работают так же, как и все другие шаблоны, которые вы видели, за исключением того, что они параметризованы по целым значениям, а не по типам. имеет больше информации по этому вопросу.«Современный дизайн C ++» и «Шаблоны C ++: Полное руководство» также содержат много информации о том, как это сделать.

...