gpt4 book ai didi

c++ - 模板重载解决问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:38 25 4
gpt4 key购买 nike

给定这段代码:

#include <string>
#include <vector>
#include <iostream>

template <typename T>
std::string stringify(const T&) {
return "{?}";
}

template <typename T>
std::string proxy(const T& in) {
return stringify(in);
}

// trying to specialize "stringify()"

template <typename T>
std::string stringify(const std::vector<T>& in) {
return "vector specialization!";
}

template <>
std::string stringify(const std::vector<int>& in) {
return "INT vector specialization!";
}

int main() {
std::cout << proxy(1); // calls the 1st

std::vector<int> intVec;
std::cout << proxy(intVec); // calls the 1st

std::vector<double> dblVec;
std::cout << proxy(dblVec); // calls the 1st

return 0;
}

我怎样才能专攻stringify()对于 vector<>proxy<> 之后?

目前我得到 {?}{?}{?}

如果我删除这个 - stringify(const std::vector<T>& in)然后是 vector<int>开始被调用,因为它将是第一个的特化。

然后我会得到 {?}INT vector specialization!{?}

有什么方法可以调用 proxy() 中的 2 个 vector 特化字符串化函数中的任何一个? - 如果它们是最后定义的 - 在 proxy() 之后功能?

有没有办法部分专注于 vector<>仍然接到来自 proxy<> 的电话?

我不想专注于 vector<int> , vector<double> , vector<UserType> ...

编辑: 忘了说我需要这个 C++98

最佳答案

首先,避免专门化函数模板,更喜欢重载。参见 Herb Sutter's article关于潜在的陷阱。

其次,您遇到的问题涉及名称查找如何对函数模板中的相关名称进行工作。里面proxy<T> , stringify是从属名称 - 它取决于 T .该名称将在模板的定义点(将找到 stringify<T>(const T&) 而不是其他重载)和在参数的关联命名空间中的实例化点再次查找(这将是 std )。这些查找都没有找到您的其他功能。

我们可以利用查找的第二部分——参数相关查找。让我们将所有内容都放在一个命名空间中(我将其命名为 N 是任意的,您可以根据需要随意重命名):

namespace N {
struct helper { };

template <typename T>
std::string stringify(helper, const T&) {
return "{?}";
}
}

template <typename T>
std::string proxy(const T& in) {
return stringify(N::helper(), in);
}

好的,到目前为止我们没有做任何改变。我们仍然得到 {?}在所有情况下。但是现在我们可以进一步重载(而不是特化)stringify仍在该 namespace 中,但在 proxy 的定义之后:

namespace N {    
template <typename T>
std::string stringify(helper, const std::vector<T>& ) {
return "vector overload!";
}

std::string stringify(helper, const std::vector<int>& ) {
return "INT vector overload!";
}
}

这两个重载将在名称查找的第二阶段找到,因为 Nhelper 的关联命名空间.现在proxy(intVFec)将找到 stringify 的所有三个重载而不仅仅是一个。现在你的代码打印:

{?}INT vector overload!vector overload!

随心所欲。以上都不需要 C++11。

关于c++ - 模板重载解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948242/

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