我正在尝试编写一个模板函数,该函数采用具有任意数字类型的任意容器类:
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>)获取元素类型吗?
您可以使用此表格:
template <typename ContType>
double avg_nums(ContType & data)
Run Code Online (Sandbox Code Playgroud)
然后获取元素类型为
typename ContType::value_type
Run Code Online (Sandbox Code Playgroud)