是否有内置方法可以转换为不同的基础类型但保留 const 限定符?

问题描述 投票:0回答:2

C++11/14/17 标准库是否有办法将对象转换为不同的类型,但具有与原始对象相同的 cv 限定符?例如

char* ptr;
const char* cptr;

type_cast<void*>(ptr)
应该产生类型
void*

type_cast<void*>(cptr)
应该产生类型
const void*

c++ type-conversion constants c++17
2个回答
3
投票

标准库中没有,但当然可以自己实现:

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
}

-1
投票

看起来没有 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);
    }
}

https://godbolt.org/z/dbCUdM

© www.soinside.com 2019 - 2024. All rights reserved.