如果成员存在,C++ 设置值

标签 c++

template<typename T>
if (std::is_same<T, FrontCameraSegment>::value) {
    height = segment.height;
}

我有一个模板来处理多个传感器。一个给我一个高度属性,其他的没有。我在我的代码中需要一次该值,Visualize() 函数的其余部分对于每个传感器都是相同的。 所以我想检查 T is_same 是否与 FrontCameraSegment 然后我想使用 segment.height 属性一次。 但是,编译器说 "height" 不是传递给 T 的所有元素的成员,这是逻辑。 由于同样的原因,强制转换不起作用。 使用继承来重构传感器是不可能的(我不允许这样做)。

所以我的问题是:我如何告诉编译器我检查过 height 是一个成员?

最佳答案

在 C++17 中,您可以在以下情况下使用 constexpr:

template<typename T>
void foo(T& segment)
{
    if constexpr (std::is_same<T, FrontCameraSegment>::value) {
       height = segment.height;
    }
    // ...
}

之前,你必须使用一些特化/调度:

// fallback
template<typename T>
void setHeightIfPossible(float& height, const T& segment) { /* Empty */ }

void setHeightIfPossible(float& height, const FrontCameraSegment& segment) {
    height = segment.height;
}

template<typename T>
void foo(T& segment)
{
    // ...
    setHeightIfPossible(height, segment);
    // ...
}

关于如果成员存在,C++ 设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974598/

相关文章:

c++ - 使用 Windows API 启动外部程序

c++ - 如何在使用for循环和数组时更改为c代码

c++ - 保证 f(ULLONG_MAX) * f(ULLONG_MAX) 不大于 ULLONG_MAX 的公式

c++ - 在 Mac 上使用 FFMPEG 而不是 Quicktime 编译 OpenCV

c++ - C++ 构造 "placement new"的用途是什么?

python - 我们可以使用映射来搜索而不是二分搜索吗?

c++ - 无法使用 read() 将文件内容读入缓冲区

c++ - 如何使指针的取消引用保留对该对象的引用?

c++ - 如何使用 libpqxx 从数组中获取值?

c++ - E2321 声明未指定标签或标识符