gpt4 book ai didi

c++ - 调用 constexpr 函数的给定重载时触发编译时错误

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

我正在编写在编译时映射中执行查找的自定义可变参数模板。

问题是,每次在该映射中找不到该值时,我都想触发编译时错误 - 最好带有描述性错误消息。

示例代码:

template<key_t k, class pair, class... pairs>
static constexpr value_t get_local(std::tuple<pair, pairs...>)
{
return (pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});
}

template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
// Trigger error!
}

我可以在代码的第二部分不定义get_local,它实际上会触发链接器错误,但这不属于“描述性错误消息”的范畴。

我相信静态断言在这里没有用。

我正在使用 C++ 17

最佳答案

直接解决方案是删除重载:

template<key_t k> static constexpr value_t get_local(std::tuple<>) = delete;

这将提供我们尝试使用不存在的基本案例的某种描述性消息。

或者,使用静态断言:

template<key_t k> struct always_false { static constexpr bool value = false; };

template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
static_assert(always_false<k>::value, "Hit bad case!");
return std::declval<value_t>();
}

always_false 实用程序需要使断言条件依赖,因此模板不是病式的;不需要诊断,因为 static_assert(false, ...) 会成功。

请注意,您可以在自己的条件运算符中自行实例化此重载:

(pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});

当您遇到具有单个元素的元组的情况时。条件表达式的两个“分支”都必须有效。最好使用 if constepxr 有条件地处理它:

if constexpr (pair::key == k) return pair::value;
else return get_local<k>(std::tuple<pairs...>{});

因为你确实指出了 pair::key == k 可以在常量表达式中计算。

关于c++ - 调用 constexpr 函数的给定重载时触发编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54760960/

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