Шаблоны, выводящие тип T из возвращаемого типа

У меня есть следующий шаблон:

template <class T>
vector<T> read_vector(int day)
{
  vector<T> the_vector;
  {...}
  return the_vector;
}

Я хотел бы иметь возможность сделать что-то вроде

vector<int> ints = read_vector(3);
vector<double> doubles = read_vector(4);

Возможно ли, чтобы шаблоны С++ определяли тип возвращаемого значения при их вызове, или я должен просто передать шаблону фиктивный аргумент с типом, который я хочу иметь для вектора? Последний работает, но грязнее.


person Luciano    schedule 30.11.2018    source источник
comment
Нет, в этом случае нужно указать тип read_vector<int>. Компилятор не может вывести по возвращаемому типу.   -  person Matthieu Brucher    schedule 30.11.2018


Ответы (1)


#include <vector>

struct read_vector
{
    int day;
    explicit read_vector(int day) : day(day) {}

    template <typename T, typename A>  
    operator std::vector<T, A>()
    {
        std::vector<T, A> v;
        //...
        return v;
    }
};

int main()
{
    std::vector<int> ints = read_vector(3);
    std::vector<double> doubles = read_vector(4);
}

ДЕМО

person Piotr Skotnicki    schedule 30.11.2018
comment
Очень умно, +1. Не могли бы вы немного объяснить это для людей, которые могут не знать точно, почему это работает именно так? - person NathanOliver; 30.11.2018
comment
Нужен ли для этого параметр распределителя A? - person Kostas; 30.11.2018
comment
@GillBates отчасти да, иначе по умолчанию будет std::allocator<T>, что приведет к ошибке вывода, когда целевой тип использует другой распределитель - person Piotr Skotnicki; 30.11.2018
comment
У этого есть (легко поправимый) недостаток. Стандарт на самом деле не гарантирует, что std::vector является шаблоном из двух параметров. - person SergeyA; 30.11.2018
comment
@SergeyA, даже если это так, зачем оператору преобразования выводить какие-либо дополнительные параметры, если они не могут использоваться смертными? - person Piotr Skotnicki; 30.11.2018
comment
Ваш оператор преобразования не будет работать, если вектор имеет, например, третий аргумент шаблона. - person SergeyA; 01.12.2018
comment
@SergeyA будет, а почему бы и нет? - person Piotr Skotnicki; 01.12.2018