处理模板参数中的 cv 修饰符
Dealing with cv-modifiers in the template argument
我正在尝试实现某种用于内存管理的包装器模板:
template<typename T>
class Foo {
T * var;
bool cpy;
Foo(T * inp, bool cpy): var(inp), cpy(cpy) {}
public:
// named ctors
static Foo<T> * newRef(T * inp){
return new Foo(inp, false);
}
static Foo<T> * newCpy(const Foo<T> * foo){
return new Foo(new T(*(foo->var)), true);
}
/* How to add cv variations to newCpy ? */
~Foo(){
if (cpy) delete var;
}
};
我正在寻找一种在newCpy()
中添加 cv 变体的方法,例如 Foo<int>::newCpy(Foo<const int> *)
和 Foo<const int>::newCpy(Foo<int> *)
。我的尝试如下所示:
template<typename T>
class Foo {
using mT = typename std::remove_cv<T>::type;
// T = const int -> mT = int
/* ... */
static Foo<T> * newCpy(const Foo<mT> * foo){
return new Foo(new T(*(foo->var)), true);
}
};
但是,由于两个原因,这不起作用:
如果
T
不是const
,则mT
将与T
相同,因此两个newCpy
将具有完全相同的签名。Foo<T>
无权访问Foo<mT>::var
有什么办法吗?
const 类型限定符的反转可以通过使用元函数 https://en.cppreference.com/w/cpp/types/conditional conditional
下面的代码需要 C++17,但是,要转换为 C++14,只需将出现的 _v
替换为 ::value
即可。
template <typename T>
using invert_const =
std::conditional_t<std::is_const_v<T>, std::remove_const_t<T>, const T>;
对于这个特定问题,示例用例将是
static Foo<T> * newCpy(const Foo<invert_const<T>> * foo) {
return new Foo(new T(*(foo->var)), true);
}
在您给出的示例中,不清楚您是否打算删除易失性限定符,但是,如果我只是误解了预期的用例,则可能会发生类似的反转:
template <typename T>
using invert_volatile =
std::conditional_t<std::is_volatile_v<T>, std::remove_volatile_t<T>, volatile T>;
这些也可以组成
template <typename T>
using invert_cv = invert_volatile<invert_const<T>>;
然后可以通过以下方式使用元函数invert_cv
static Foo<T> * newCpy(const Foo<invert_cv<T>> * foo) {
return new Foo(new T(*(foo->var)), true);
}
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 如何检查给定的参数是否为 cv::noArray()?
- OPENCV 3:如何将CV :: MAT作为可选参数传递
- 无法将参数 8 从 'int' 转换为 'cv::HOGDescriptor::HistogramNormType'
- 处理模板参数中的 cv 修饰符
- 如何有效地传递 std::vector<cv::P oint3f> 的子向量作为参数(不拥有函数)
- 以 cv::P oint_<T> 作为参数的模板函数无法编译
- 使用此功能的CV合并参数制作功能模板
- 嵌套模板参数以及函数参数的 cv 和 ref- 限定符
- 使用 cv::P oint 作为参数访问图像
- Boost Python wrapper 和 OpenCv 参数错误与 cv::Mat.
- 具有 const cv::Mat 类型的参数将在函数中更改
- 错误 C2664:'cvSaveImage':无法将参数 2 从 'cv::Mat' 转换为 'const CvArr *'
- 'weight'参数在 Open CV 对象检测中的含义是什么
- 我可以使用 opencv 函数(如 cv::multiply 和 std::vector<cv::Mat> 作为输入和输出参数吗?
- 错误 C2665:'cv::fillPoly':2 个重载都无法转换所有参数类型
- 如何将 vtkMatrix 和 std::vector<cv::P oint3f> 作为函数参数传递?
- 如何从带有cv和引用限定符的std::函数中获取参数和返回类型
- 错误 C2664: 'cv::Mat::Mat(int,int,int)' : 无法将参数 1 从 'cv::Size' 转换为 'int'
- result_of具有 cv 限定参数的成员对象