gpt4 book ai didi

c++ - if constexpr std::is_same 在 VS 2022 下

转载 作者:行者123 更新时间:2023-12-05 05:44:59 24 4
gpt4 key购买 nike

我已将我的一个项目从 VS 2019 转换为 VS 2022,但以下条件编译模板无法再正确编译:

struct T_USER;
struct T_SERVICE;

template<typename T>
class system_state
{
public:
system_state();
};


template<typename T>
system_state<T>::system_state()
{
if constexpr (std::is_same<T, T_USER>)
{
std::cout << "User templ\n";
}
else if constexpr (std::is_same<T, T_SERVICE>)
{
std::cout << "Service templ\n";
}
else
{
//Bad type
static_assert(false, "Bad template type in T: must be either T_USER or T_SERVICE");

std::cout << "Unknown templ\n";
}
}

我们的想法是根据特定模板编译 system_state 中的部分代码,例如:

int main()
{
system_state<T_USER> user_state;
}

但是现在 if constexpr std::is_same 似乎没有检测到我的 T 并且我总是得到我的 static_assert 子句:

Bad template type in T: must be either T_USER or T_SERVICE

有什么变化?它曾经在 VS 2019 中工作。

最佳答案

代码格式错误,因为 constexpr if :

Note: the discarded statement can't be ill-formed for every possiblespecialization:

template <typename T>
void f() {
if constexpr (std::is_arithmetic_v<T>)
// ...
else
static_assert(false, "Must be arithmetic"); // ill-formed: invalid for every T
}

The common workaround for such a catch-all statement is atype-dependent expression that is always false:

template<class> inline constexpr bool dependent_false_v = false;
template <typename T>
void f() {
if constexpr (std::is_arithmetic_v<T>)
// ...
else
static_assert(dependent_false_v<T>, "Must be arithmetic"); // ok
}

您可以在 else 中使用上面的依赖于类型的表达式也有分支,例如

//Bad type
static_assert(dependent_false_v<T>, "Bad template type in T: must be either T_USER or T_SERVICE");

顺便说一句:在 if constexpr (std::is_same<T, T_USER>) 中, std::is_same<T, T_USER>是类型但不是 bool值(value);你应该把它改成std::is_same_v<T, T_USER> , 或 std::is_same<T, T_USER>::value , 或 std::is_same<T, T_USER>() (std::is_same<T, T_USER>{})。

关于c++ - if constexpr std::is_same 在 VS 2022 下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71491330/

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