从嵌套模板中删除常量
Remove const from nested template
我有一个模板化类,它有自己的存储,但也可以用来使用指向数组中某个位置的指针来"查看"(甚至修改)更大的数组。查看更大的数组是使用以下方法完成的(请参阅下面的完整示例):
Tensor<double> t;
t.view(&array[i]);
当数组标记为const
可以使用以下内容
Tensor<const double> t;
t.view(&array[i]);
我的问题是现在:
我想为Tensor<...>
编写一个带有一个模板参数的函数,该函数可用于映射const
数组并修改映射的副本。如何从"嵌套模板"中删除const
?或者,如果无法做到这一点,如何在不将其标记为模板const
的情况下使用地图?
请注意,我目前没有从Tensor<const double>
转换为Tensor<double>
。
显示此行为的一个简单、完整的示例是
#include <iostream>
#include <vector>
template<class T>
class Tensor
{
private:
T m_container[4];
T *m_data;
public:
// constructor
Tensor() { m_data = &m_container[0];};
// copy constructor
Tensor(const Tensor& other)
{
for ( auto i = 0 ; i < 4 ; ++i )
m_container[i] = other[i];
m_data = &m_container[0];
}
// index operator
T& operator[](size_t i) { return m_data[i]; }
const T& operator[](size_t i) const { return m_data[i]; }
// point to external object
void view(T *data) { m_data = data; }
};
template<class T>
T someOperation(std::vector<double> &input, size_t i)
{
T t;
t.view(&input[i*4]);
// ... some code that uses "t" but does not modify it
T s = t;
return s;
}
int main()
{
std::vector<double> matrix = { 1., 2., 3., 4., 11., 12., 13., 14. };
Tensor<double> tensor = someOperation<Tensor<double>>(matrix, 1);
return 0;
}
例如使用clang++ -std=c++14 so.cpp
编译。
现在我想将函数的签名更改为
template<class T>
T someOperation(const std::vector<double> &input, size_t i)
上述函数可以使用
someOperation<Tensor<const double>>(...)
但显然我不能再改变s
了。我该如何解决这个问题?
考虑 std::remove_const:
template<typename T>
void f(T& t);
double const d = 1.0;
f(d);
template<typename T>
void f(T& t)
{
T ct = t;
//ct += 1.0; // refuses to compile!
typename std::remove_const<T>::type nct = t;
nct += 1.0; // fine...
}
编辑:好的,只有一半的真相...
通过提供的示例,事情变得更加复杂,因为您需要交换内部模板类型......
这可以通过模板模板函数来完成:
template<template < class > class T, typename V>
auto someOperation(std::vector<double>& input, size_t i)
{
T<V> t;
t.view(&input[i*4]);
T<typename std::remove_const<V>::type> s = t;
return s;
}
但是,这给您带来了很多麻烦:
常量成员不能在构造函数体中初始化,所以你需要:Tensor
(Tensor const&other) : m_container { 其他[0], 其他[1], 其他[2], 其他[3] }, m_data(m_container) { }
Tensor<double>
和Tensor<double const>
是完全不同的类型,因此它们需要彼此构造:Tensor(Tensor
这甚至允许您从例如整数张量初始化例如双张量 - 如果需要与否,决定您...::type> const& other); Tensor(Tensor 模板<类型名TT>Tensor(Tensorconst& other);类型名TT>
相关文章:
- 从 Typedef 数据类型中删除常量
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 从嵌套模板中删除常量
- 防止将临时传递为常量引用的方法,该方法比删除 r 值重载更好地缩放
- 不能只删除方法的常量重载?
- std::remove_pointer 无法删除 VS2012 上的常量易失性函数指针
- 当调用来自同一个重载的非常量版本成员函数时,可以删除常量限定符吗
- 从函数返回类型中删除常量是否会中断 ABI
- 如何从'char const*'中删除常量
- 模板引用折叠正在删除常量引用返回类型的cv限定符
- 如何删除类型名中每个元素的常量引用修饰符.T.
- 类成员有自己的常量成员,因此构造函数被隐式删除
- C++无法在递归中删除对象的常量
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 如果模板参数是指针,则在 getter 上删除了常量限定符
- 如何在 c++ 中删除常量数组
- 类型为 std::String&- 的非常量引用的初始化无效 - 如何删除
- trait从成员函数类型中删除常量
- 如何从成员函数指针中删除常量限定符
- 正在从模板函数内部的类型中删除常量