从模板化容器类型获取元素类型

sta*_*son 1 c++ templates stl

我正在尝试编写一个模板函数,该函数采用具有任意数字类型的任意容器类:

template <typename NumType, typename ContType>
double avg_nums(const ContType<NumType> & data)
{
    double sum = 0;

    for(ContType::const_iterator iter = data.cbegin(); iter != data.cend(); ++iter)
    {
        if(typeid(NumType) == typeid(char) || typeid(NumType) == typeid(unsigned char))
        {
            std::cout << static_cast<int>(*iter) << std::endl;
        }
        else
        {
            std::cout << *iter << " ";
        }

        sum += *iter;
    }
    std::cout << std::endl;

    return sum  / data.size();
}
Run Code Online (Sandbox Code Playgroud)

但这会产生语法错误(VS2012)。这也不起作用:

template <typename NumType, typename ContType<NumType> >
double avg_nums(ContType<NumType> & data)
Run Code Online (Sandbox Code Playgroud)

我希望容器中的对象类型是模板参数以及容器类型,这样我就可以添加对 NumType 的特定情况的检查。如果我将函数签名更改为

template <typename NumType, typename ContType>
double avg_nums(ContType & data)
Run Code Online (Sandbox Code Playgroud)

它可以构建,但现在它依赖于显式指定正确的模板参数:

std::vector<char> cvec = boost::assign::list_of(0) (1) (1) (2) (3) (5);
std::vector<int> ivec = boost::assign::list_of(0) (1) (1) (2) (3) (5);

avg_nums<char, std::vector<char>>(cvec);
avg_nums<int, std::vector<int>>(ivec);
Run Code Online (Sandbox Code Playgroud)

如果我将签名更改为

template <typename ContType>
double avg_nums(ContType & data)
Run Code Online (Sandbox Code Playgroud)

它有效,但现在我无法直接访问元素类型。我可以从容器的类型(std::vector<int>std::list<unsigned char>)获取元素类型吗?

jua*_*nza 5

您可以使用此表格:

template <typename ContType>
double avg_nums(ContType & data)
Run Code Online (Sandbox Code Playgroud)

然后获取元素类型为

typename ContType::value_type
Run Code Online (Sandbox Code Playgroud)