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/