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

Deduct template parameter fail while using if constexpr

我想弄清楚 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 是一个 运行 时间参数。

通过添加 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 合格的成员函数,正如您要调用的那样,每个 const 个对象 类里面的f.


也就是说,如果您可以使用 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);