我想编写一个从结构中提取指针字段的函数。要求是,如果我将struct作为const参数传递,则返回的类型应为const。如果不是,则返回的类型不应为const。
例如,
struct S {
char *p;
};
// approach 1: two overload functions with duplicate body
auto extract(S &input) -> int * {
return reinterpret_cast<int *>(input.p + 12);
}
auto extract(const S &input) -> const int * {
return reinterpret_cast<const int *>(input.p + 12);
}
// approach 2: macro
#define macro_extract(input) (reinterpret_cast<int *>(input.p + 12))
模板或最新的C ++标准中是否有任何技巧可以编写强类型函数而无需复制主体?
编辑:稍微更改了示例以更准确地反映实际问题。
这是带有单个功能模板的解决方案:
template<typename T,
typename = std::enable_if_t<
std::is_same_v<
std::remove_cv_t<
std::remove_reference_t<T>>, S>>>
auto extract(T&& input)
-> std::conditional_t<
std::is_const_v<
std::remove_reference_t<T>>, int const *, int *>
{
return input.p;
}
这是一个演示。
我认为不用多说,过载组会更好。如果函数体很大,您仍然可以从const重载中调用非const版本,然后在其中添加const。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句