gpt4 book ai didi

c++ - 如何将派生类的 std::list 而不是父类的 std::list 传递给函数?

转载 作者:行者123 更新时间:2023-12-02 01:25:43 25 4
gpt4 key购买 nike

为什么第二次调用 print_all 函数会导致静态语义错误

#include <list>
using std::list;
class foo {
// ...
};
class bar : public foo {
// ...
};

static void print_all(list<foo*>& L) {
// ...
}

list<foo*> LF;
list<bar*> LB;
// ...
print_all(LF); // works fine
print_all(LB); // static semantic error

最佳答案

std::list是一个模板类,这意味着,需要使用一种类型进行实例化,以获得所需模板类的完整类定义。当 std::list已实例化为 foobar ,我们得到完全不同的类型。这意味着bar foo (由于继承),但是std::list<foo*>std::list<bar*> 的类型不同。因此,print_all(std::list<foo*> &L)只能获取指向foo指针列表 的,根据给定的定义。

该问题最简单的解决方案是 templated function 。使 print_all函数模板化了一个,它也可以接受其他类型(即 std::list<foo*>std::list<bar*> 等)。

template<typename Type>                   // --> template parameter
void print_all(std::list<Type*> const& L) // --> function parameter
// ^^^^^^ --------> use `const-ref` as the list is
// not being modified inside the function
{
// print the list
}

但是,现在也接受其他类型,例如 std::list<int*> , std::list<float*>等等(所有其他可能的类型)。这可能不是您想要的行为。我们有所谓的 "Substitution Failure Is Not An Error" (SFINAE) 技术,通过该技术可以限制模板化 print_all 的实例化函数,当且仅当,模板 Type std::is_base_of foo类(class)。类似的东西

#include <type_traits> // std::enable_if, std::is_base_of

template<typename T>
auto print_all(std::list<T*> const& L)-> std::enable_if_t<std::is_base_of_v<foo, T>> // in C++14
// or
// auto print_all(std::list<T*> const& L)-> typename std::enable_if<std::is_base_of<foo, T>::value>::type // in C++11
{
// print the list
}

关于c++ - 如何将派生类的 std::list 而不是父类的 std::list 传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645926/

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