Почему невозможно использовать псевдоним шаблона в функции в качестве параметра и автоматически выводиться? - PullRequest
1 голос
/ 14 января 2020

Я пытался упростить функцию шаблона, используя псевдоним шаблона вместо базового типа:

template<typename T,
    typename Traits = std::char_traits<T>,
    typename Allocator = std::allocator<T>,
    typename String = std::basic_string<T, Traits, Allocator>,
    typename Vector = std::vector<String>>
Vector make_vector_from_string(const String & str)
{
    //do something with str parameter

    return Vector{
        {str}
    };
}

Но вызывающая сторона должна указать тип шаблона, поскольку компилятор не может определить T для параметр:

std::string bar{"bar"};
auto strings{make_vector_from_string<char>(bar)};

Если тип функционального параметра изменяется на std::basic_string<T, Traits, Allocator> вместо String, вызывающий абонент может просто вызвать make_vector_from_string(bar); без указания параметра шаблона. Почему это?

1 Ответ

1 голос
/ 14 января 2020

T не вычитается, только String.

Если вы хотите автоматически указать тип для T, Traits, Allocator. Вы должны сделать это по-другому:

template <
    typename String,
    typename T = typename String::value_type,
    typename Traits = typename String::traits_type,
    typename Allocator = typename String::allocator_type,
    typename Vector = std::vector<String>>
Vector make_vector_from_string(const String& str)
{
    //do something with str parameter

    return {str};
}

Но

template <typename String>
std::vector<String> make_vector_from_string(const String& str)
{
    //do something with str parameter

    return {str};
}

Кажется достаточно.

Или даже

std::vector<std::string> make_vector_from_string(const std::string& str)
{
    return { str};
}
...