gpt4 book ai didi

c++ - 函数模板重载与显式特化

转载 作者:太空狗 更新时间:2023-10-29 22:58:48 29 4
gpt4 key购买 nike

我设置了两个模板函数来获取不同 STL 容器的总和:一个用于列表和 vector ,另一个用于 map 。

请看第二个模板函数定义的注释行(1)和(2)。注释掉的代码(=2)也可以正常工作,所以我不知道更推荐哪种语法。

另外,每个方法是如何调用的(我在评论中猜对了吗)?说 (1) 是函数模板重载似乎还不够,因为它在关键字"template"之后缺少类型名参数。也就是说,它应该像 template<typename T>结合 (1) 以便将方法作为函数模板重载调用,我猜。请给我他们正确的名字。

template <typename T> // T : container
double Sum(const T &l) // get Container
{
double sum = 0;
T::const_iterator i;
for (i = l.begin(); i != l.end(); ++i) { sum += *i; }
return sum;
}

template <> // get container
double Sum(const map<string, double> &m) // (1) function template overloading
// double Sum<map<string, double> >(const map<string, double> &m) // (2) explicit specialization
{
double sum = 0;
map<string, double>::const_iterator i; // obtain Iterator from Container
for (i = m.begin(); i != m.end(); i++) { sum += i->second; } // sum. ('first' is index, 'second' is data)
return sum;
}

最佳答案

都是显式特化语法

  • template <> double Sum(const map<string, double> &m);

  • template <> double Sum<map<string, double> >(const map<string, double> &m)

第一个让编译器推导参数,而第二个,你是显式的。

当编译器无法推导所有模板参数时需要第二个

template <typename T> std::string getNameType();

template <> std::string getNameType<int>() { return "int"; }

或消除要专门化的模板函数的歧义

template <typename T> void foo(T);

template <typename T> void foo(T*); // overload, not specialization

//template <> void foo(int*); // Error: do you mean T = int for foo(T*) or T = int* for foo(T)

template <> void foo<int*>(int*); // specialize foo(T)
template <> void foo<int>(int*); // specialize foo(T*)

通常对函数使用重载而不是特化更好,所以对于你的例子:

template <typename Key>
double Sum(const std::map<Key, double> &m)
{
double sum = 0;
for (const auto& p : m) { sum += p.second; } return sum;
}

关于c++ - 函数模板重载与显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39504881/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com