C++ 是否有一种内置方法可以强制转换为不同的基础类型,但保留常量限定符?

C++ 是否有一种内置方法可以强制转换为不同的基础类型,但保留常量限定符?,c++,type-conversion,constants,c++17,C++,Type Conversion,Constants,C++17,C++11/14/17标准库是否有方法将对象强制转换为不同的类型,但使用与原始对象相同的cv限定符?例如 char* ptr; const char* cptr; type\u cast(ptr)应生成类型void* type\u cast(cptr)应产生标准库中不存在的类型const void*,但当然可以自己实现: namespace detail_base_type_cast { template <class In, class Out> struct c

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

char* ptr;
const char* cptr;
type\u cast(ptr)
应生成类型
void*


type\u cast(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<In, Out>::type
base_type_cast(In &obj) {
    return obj; // Implicit derived-to-base conversion
}
名称空间详细信息\u基础\u类型\u转换{
模板
结构副本{
使用类型=输出;
};
模板
结构副本{
使用type=Out const&;
};
模板
结构副本{
使用type=Out volatile&;
};
模板
结构副本{
使用type=Out const volatile&;
};
}
模板
类型名称详细信息\u基本类型\u类型::类型
基础类型铸件(In和obj){
return obj;//隐式派生到基转换
}

似乎没有C++17或更早版本的stdlib方法可以在单个函数/语句中实现您想要的功能。 然而,在C++20中可能会出现类似的情况:(似乎在任何编译器中都不可用)

编辑:但它在范围库中可用,因此如果您已经使用它,可以使用
Ranges::common_reference\t

但对于您的用例,要么在参数constness上重载,要么在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);
    }
}
模板
自动foo(T&bar){
//很多代码
if constexpr(std::is_const_v){
返回静态_-cast(bar);
}否则{
返回静态_-cast(bar);
}
}

因此,如果修饰符错误,您对编译时失败并不满意,例如使用
静态\u cast
?为什么需要显式地将
Bar
转换为
Foo
?语言中没有内置这种转换。尽管您可以使用std::is_const
的组合编写自己的代码,
std::add_const_t
std::remove_const_t
@VioletGiraffe,为什么不基于参数的cv限定符重载呢?@VioletGiraffe你可以使用
if constexpr
来大大减少重复。我不知道
公共参考
对我的问题有什么帮助,你能详细说明一下吗?它给了你一个共同的参考,正如它所说的。即,可用于引用两种(或更准确地说,所有提供的)类型的引用,因此,如果其中一种是
const
,那么它也将是const。请参阅:该问题也适用于指针,但
common_reference
仅适用于基类型和引用类型。@JonHarper在我发表评论后对其进行了编辑。然而,将引用转换为指针是很简单的。也就是说,
common\u pointer
可以定义为类似于
add\u pointer\t
。不知道所有“安静”的选票是怎么回事。