使用 if constexpr 时扣除模板参数失败
Deduct template parameter fail while using if constexpr
我想弄清楚 sfinae 概念在 C++ 中是如何工作的。但是如果 bool
是 true
或 false
.
我无法说服对象类型编译器
#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);
我想弄清楚 sfinae 概念在 C++ 中是如何工作的。但是如果 bool
是 true
或 false
.
#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);