正在从模板函数内部的类型中删除常量
Removing const-ness from a type inside template function
void foo (void *p); // library function; can't edit
template<typename T>
void Remove (T *p)
{
// main code
foo(p); // Can we remove const ness of T here ?
}
我有多个像Remove()
这样的函数,它也可以用const T*
调用,这与foo(void*)
不匹配。在不重载/专用Remove()
的情况下,我可以删除T*
的const
吗。。。用法:
const int *p;
Remove(p); // error related to `foo()`
如果你真的需要它,有一个boost/C++0x元函数:
template<typename T>
void Remove (T *p)
{
foo( const_cast< typename std::remove_const<T>::type *> (p) );
}
测试:https://ideone.com/L6urU
怎么样:
template <typename T>
struct nonconst {
static T& value(T& value) { return value; }
};
template <typename T>
struct nonconst<T const> {
static T& value(T const& value) { return const_cast<T&>(value); }
};
按如下方式使用:
template<typename T>
void Remove (T* p) {
foo(&nonconst<T>::value(*p));
}
(或者将模板进一步专门用于(非(常量指针。(
这将有效地获取一个指向常量对象的指针,并删除常量,从而使其(foo
(能够更改对象。这将与实际暴露的接口不一致,这意味着它在任何类型上都可以平等地(预期地(工作。
不仅如此,它还允许您使用实际const对象的地址来调用它,该对象将是未定义的行为。
相反,如果绝对需要(并确保对象不是常量(,您应该在调用模板函数之前删除常量,以便它按预期工作(而不是更改常量类型(。
const A *p;
Remove(const_cast<A*>(p)); // error for `foo()`
您也可以先对const void *
执行static_cast
,然后对void *
执行const_cast
:
template<typename T>
void Remove (T *p)
{
foo(const_cast<void*> (static_cast <const void*> (p)));
}
无可否认,它相当丑陋。
相关文章:
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 将类型添加到现有模板而不删除 c++17
- 删除[]具有不同类型的未定义行为?
- 创建模板类型而不新建/删除
- 从 Typedef 数据类型中删除常量
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 根据模板类型有条件地删除变量
- 从浮点数中删除小数部分但保留类型的有效方法
- 从自定义数据类型向量中删除重复元素
- C++ 模板<类型名 T> 删除
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么许多标准库类型在 C++20 中删除 operator!=?
- 如何从指针类型和指针到指针类型中删除__unaligned说明符
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- C++ - 按自定义数据类型向量的值删除元素
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何删除类内类类型的类成员指针