gpt4 book ai didi

C++ 方法参数可以是原语或对象

转载 作者:行者123 更新时间:2023-12-02 02:36:18 27 4
gpt4 key购买 nike

假设我有一个 C++ 类 Foo。它有一个模板化方法 setValue(),需要接受以下任何一个作为其参数:

  • 任何原始类型
  • Bar 类型的对象
  • Bar 子类的对象

我想写这样的东西。

template <class T>
void setValue(T& value) {
if (std::is_fundamental<T>::value)
setPrimitiveValue(value)
else {
Bar* bar = dynamic_cast<Bar*>(&value);
if (bar != NULL)
setBarValue(*bar);
}
}

但这不能编译。当我使用 int 调用该方法时,编译器提示 dynamic_cast 不能在 int* 上使用。即使该代码分支不会针对原语执行,编译器仍然需要编译它。

我怎样才能做到这一点?请注意,这是类中的方法,因此不允许模板专门化。

最佳答案

C++17起,您可以使用 if constexpr 轻松解决此问题.

正如您所期望的,它可以从编译中排除整个分支(而不是像普通的if一样执行)。

注意:代码仍然受语法规则的约束。详细信息超出了本答案的范围。

template <class T>
void setValue(T& value) {
if constexpr (std::is_fundamental<T>::value)
setPrimitiveValue(value)
else {
Bar* bar = dynamic_cast<Bar*>(&value);
if (bar != NULL)
setBarValue(*bar);
}
}

关于C++ 方法参数可以是原语或对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59061207/

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