gpt4 book ai didi

c++ - 如何在编译时评估 Primitive 与 Class 模板?

转载 作者:太空宇宙 更新时间:2023-11-04 14:52:43 24 4
gpt4 key购买 nike

当我们做...

template <typename T>
void foo(T x)
{
if (is_fundamental<T>::value)
{
...
} else
{
...
}
}

我认为 if语句(以及 is_fundamental<T>::value )在运行时评估,对吗?

如果是,有没有办法在编译时进行评估?我想要类似...

template <primitive_typename T>
void foo(T x)
{
...
}


template <noPrimitive_typename T>
void foo(T x)
{
...
}

一个解决方案是重载所有可能的原始类型,但这并不是一个真正令人满意的解决方案,因为它需要多次复制原始类型的代码。有没有办法用一个类型名来引用所有基元?

最佳答案

在 C++17 中,if constexpr 语句在编译时评估条件并丢弃未选择的分支:

if constexpr(std::is_fundamental_v<T>) {
// do something with x
} else {
// do something else with x
}

一种老式的方法是使用标签分派(dispatch):

template <typename FundamentalType>
void foo_helper(FundamentalType x, std::true_type);

template <typename NonFundamentalType>
void foo_helper(NonFundamentalType x, std::false_type);

template <typename T>
void foo(T x) {
foo_helper(x, std::is_fundamental<T>{});
}

您也可以使用部分专用的帮助程序结构,但它需要更多代码。

关于c++ - 如何在编译时评估 Primitive 与 Class 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245106/

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