C++11/14/17 标准库是否有办法将对象转换为不同的类型,但具有与原始对象相同的 cv 限定符?例如
char* ptr;
const char* cptr;
type_cast<void*>(ptr)
应该产生类型 void*
type_cast<void*>(cptr)
应该产生类型 const void*
标准库中没有,但当然可以自己实现:
namespace detail_base_type_cast {
template <class In, class Out>
struct copy_cv {
using type = Out;
};
template <class In, class Out>
struct copy_cv<In const, Out &> {
using type = Out const &;
};
template <class In, class Out>
struct copy_cv<In volatile, Out &> {
using type = Out volatile &;
};
template <class In, class Out>
struct copy_cv<In const volatile, Out &> {
using type = Out const volatile &;
};
}
template <class Out, class In>
typename detail_base_type_cast::copy_cv<In, Out>::type
base_type_cast(In &obj) {
return obj; // Implicit derived-to-base conversion
}
看起来没有 C++17 或更早的 stdlib 方法可以在单个函数/语句中执行您想要的操作。 然而,看起来 C++20 中可能有类似的东西:https://en.cppreference.com/w/cpp/types/common_reference(似乎在任何编译器中都不可用)。
编辑:但它在 Ranges lib 中可用,因此如果您已经使用它,则可以使用
ranges::common_reference_t
代替。
但对于您的用例,重载参数常量或使用
if constexpr
可能是更好的选择。
即像这样的东西:
template<typename T>
auto foo(T &bar) {
// lots of code
if constexpr(std::is_const_v<T>) {
return static_cast<const Foo&>(bar);
} else {
return static_cast<Foo&>(bar);
}
}