gpt4 book ai didi

c++ - 使用 if constexpr 时扣除模板参数失败

转载 作者:行者123 更新时间:2023-12-04 12:30:34 25 4
gpt4 key购买 nike

我正在尝试弄清楚 sfinae 概念在 C++ 中的工作原理。但如果 booltruefalse,我无法说服对象类型编译器。

#include <iostream>

class A {
public:
void foo() { std::cout << "a\n"; }
};

class B {
public:
void ioo() { std::cout << "b\n"; }
};

template<class T>
void f(const T& ob, bool value = false)
{
if constexpr (!value) ob.foo();
else ob.ioo();
}

int main()
{
A ob1;
B ob2;
f(ob1, true);
f(ob2, false);
}

最佳答案

您需要让 bool 参数成为模板的一部分。在您的情况下, bool value 是一个运行时参数。

通过添加作为非模板参数,your code can compile :

template<bool Flag, class T>
// ^^^^^^^^
void f(const T& ob)
{
if constexpr (Flag) {
ob.foo();
}
else
ob.ioo();
}

你可以这样调用:

f<true>(ob1);
f<false>(ob2);

作为旁注,您的 A::foo()B::ioo() 必须是 const 合格的成员函数,正如你想调用的那样,在 f 中使用每个类的 const 对象。


也就是说,如果您可以使用 std::is_same,则 bool 参数是多余的

#include <type_traits> // std::is_same

template<class T>
void f(const T& ob)
{
if constexpr (std::is_same_v<T, A>) {
ob.foo();
}
else if constexpr (std::is_same_v<T, B>)
ob.ioo();
}

现在调用需要只是:

f(ob1);
f(ob2);

关于c++ - 使用 if constexpr 时扣除模板参数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69371551/

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