Шаблон C ++ для объявлений классов

0

Итак, я могу сделать следующее:

template<typename T>
void printValue(T theValue)
{
     std::cout << theValue;
}

int main()
{
   /.....
   int value = 5; 
   printValue(value); 

   return 0;
}

Но если я хочу сделать следующее для класса:

template<class Type_T>
class Foo {

    public:
       template<typename Inverse>
       Foo(Inverse begin, Inverse end)
         : values(begin, end)
       {



       }

    protected:

       std::vector<Type_T> values;
};

int main() {

    std::vector<int> va = {1, 2, 3, 4, 5, 6};

    Foo<int> f(va.begin(), va.end());

    return 0;
}

Я должен указать тип. Есть ли способ, чтобы компилятор мог определить тип, зная, какой тип итератора проходит?

Теги:
templates
oop

1 ответ

6
Лучший ответ

Вы можете создать вспомогательную функцию make_foo() которая выводит тип из приведенного аргумента:

template<typename U>
Foo<typename U::value_type> make_foo(U first, U last)
{
    return { first, last };
}

auto f = make_foo(va.begin(), va.end());
  • 0
    Будет ли auto f = make_foo , где вектор находится внутри класса?
  • 0
    @ user1326876 Нет, вы бы назвали его там, где хотите использовать объект Foo . make_foo возвращает объект Foo<typename U::value_type> , где U автоматически выводится из аргументов. auto - это ключевое слово, введенное c ++ 11 и означающее: «вывод типа на основе того, что я назначаю своей переменной».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню