gpt4 book ai didi

c++ - 为什么 SFINAE 在这个简单的成员函数重载中不起作用

转载 作者:行者123 更新时间:2023-11-28 01:20:21 25 4
gpt4 key购买 nike

为什么 SFINAE 在这个简单的例子中不起作用?如果我注释掉模板化的“添加”代码编译正常。为什么编译器在替换失败后不尝试调用非模板“添加”?

我正在使用 MSVS 2017。


#include <set>
#include <memory>

struct button_t
{
virtual ~button_t() {}
};

struct up_down_button_t : button_t
{
};


struct gui_t
{

std::set<std::shared_ptr<button_t> > buttons;

void add(const std::shared_ptr<button_t>& b) {
buttons.insert(b);
}

template<class container_t>
void add(container_t& c) {
for (auto& i : c)
add(i);
}

} gui;

int main(int argc, char* argv[]) {


auto b = std::make_shared<up_down_button_t>();
gui.add(b);

}

是否可以使该代码在没有冗长的样板代码(如 std::enable_if 等)的情况下工作?

最佳答案

来自 cppreference :

Only the failures in the types and expressions in the immediate context of the function type or its template parameter types [or its explicit specifier (since C++20)] are SFINAE errors

这里,失败发生在函数体中,所以它是一个替换失败,但不是在 SFINAE 上下文中 - 所以它是一个错误。

概念旨在帮助减轻样板代码的负担,因此如果您的编译器已经支持它们,您可以尝试使用它们。

关于c++ - 为什么 SFINAE 在这个简单的成员函数重载中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589549/

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