gpt4 book ai didi

c++ - std::conditional 编译时分支评估

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:14 28 4
gpt4 key购买 nike

编译这个:

template < class T, class Y, class ...Args >
struct isSame
{
static constexpr bool value = std::conditional<
sizeof...( Args ),
typename std::conditional<
std::is_same< T, Y >::value,
isSame< Y, Args... >, // Error!
std::false_type >::type,
std::is_same< T, Y > >::type::value;
};

int main()
{
qDebug() << isSame< double, int >::value;
return EXIT_SUCCESS;
}

给我这个编译器错误:

error: wrong number of template arguments (1, should be 2 or more)

问题是 isSame< double, int >有一个空的 Args参数包,所以isSame< Y, Args... >有效地变成 isSame< Y >与签名不匹配。

但我的问题是:为什么要对该分支进行评估? sizeof...( Args )false , 所以内部 std:conditional不应评价。这不是一段运行时代码,编译器知道 sizeof..( Args )永远true使用给定的模板类型。

如果你很好奇,它应该是 std::is_same 的可变版本,并不是说它有效...

最佳答案

But my question is: Why is that branch being evaluated at all?

因为没有评估,那根本就不是一个分支。 这是一个模板,它被实例化以成功实例化 std::conditional 模板
我在这里的意思是,评估抽象在编写模板元程序时很有用,但您永远不应该忘记模板系统真正在做什么

如果您需要有条件地实例化一个可能格式错误的模板,请添加一个间接级别。检查this回答一个例子。

关于c++ - std::conditional 编译时分支评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24098278/

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