gpt4 book ai didi

c++ - 派生类的模板参数推导

转载 作者:行者123 更新时间:2023-11-30 04:43:36 26 4
gpt4 key购买 nike

代码来自https://en.cppreference.com/w/cpp/language/template_argument_deduction ,现在我添加 void f(T*) , 和 f(&d)将调用 f(T*) .

(1) 你能解释为什么吗f(T*)叫什么?

https://en.cppreference.com/w/cpp/language/function_template它提到“模板参数推导发生在函数模板名称查找之后(可能涉及参数相关查找)和重载解析之前。”

选择 f(T*) 是因为 'overload resolution' 中的 'Exact match',对吗?所以在模板参数推导阶段,选择了 f(B),然后在稍后的重载解析阶段,选择了 f(T) 并接管了 f(B*),这是正确的吗?

谢谢

(2) 调用f(&d)应该做哪些修改?调用f(B<T>*) ?我还需要 f(T*)一,所以f(T*)必须保留。

#include <iostream>
using namespace std;

template<class T> struct B { };
template<class T> struct D : public B<T> { };

template<class T> void f(T*) { cout<< "T*"<< endl; }
template<class T> void f(B<T>*) { cout<< "B<T>*"<< endl; }

int main() {
D<int> d;
f(&d);
return 0;
}

最佳答案

  1. Can you explain why f(T*) is called?

因为它是完全匹配的(当 T 被推断为 D<int> 时)。对于 f(B<int>*)被称为 D<int>* 的隐式转换至 B<int>*是必需的。

  1. What changes should I make to make the call f(&d) to call the f(B<T>*)?

可以申请SFINAE .例如

// type trait to get the template parameter from template instantiation
template <typename T>
struct get_template_parameter {
using type = T;
};
template <template <typename> class X, typename T>
struct get_template_parameter<X<T>> {
using type = T;
};
template <typename T>
using get_template_parameter_t = typename get_template_parameter<T>::type;

// only usable when T is B's instantiation or derived class of B's instantiation
template<class T>
std::enable_if_t<!std::is_base_of_v<B<get_template_parameter_t<T>>, T>>
f(T*) { cout<< "T*"<< endl; }

template<class T> void f(B<T>*) { cout<< "B<T>*"<< endl; }

LIVE

关于c++ - 派生类的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168609/

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