1

我试图通过使用模板别名而不是基础类型来简化模板函数:

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);而无需指定模板参数。这是为什么?

4

1 回答 1

2

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};
}
于 2020-01-14T10:46:14.040 回答