C++ 在模板参数中处理cv修饰符
我试图实现某种包装器模板,用于内存管理:C++ 在模板参数中处理cv修饰符,c++,templates,constants,C++,Templates,Constants,我试图实现某种包装器模板,用于内存管理: 模板 福班{ T*var; boolcpy; Foo(T*inp,boolcpy):var(inp),cpy(cpy){} 公众: //命名因子 静态Foo*newRef(T*inp){ 返回新的Foo(inp,false); } 静态Foo*newCpy(常量Foo*Foo){ 返回新的Foo(新的T(*(Foo->var)),true); } /*如何将cv变体添加到newCpy*/ ~Foo(){ 如果(cpy)删除var; } }; 我正在寻找
模板
福班{
T*var;
boolcpy;
Foo(T*inp,boolcpy):var(inp),cpy(cpy){}
公众:
//命名因子
静态Foo*newRef(T*inp){
返回新的Foo(inp,false);
}
静态Foo*newCpy(常量Foo*Foo){
返回新的Foo(新的T(*(Foo->var)),true);
}
/*如何将cv变体添加到newCpy*/
~Foo(){
如果(cpy)删除var;
}
};
我正在寻找一种在newCpy()
中添加cv变体的方法,例如Foo::newCpy(Foo*)
和Foo::newCpy(Foo*)
。我的尝试如下所示:
模板
福班{
使用mT=typename std::remove_cv::type;
//T=const int->mT=int
/* ... */
静态Foo*newCpy(常量Foo*Foo){
返回新的Foo(新的T(*(Foo->var)),true);
}
};
但是,由于两个原因,这不起作用:
T
不是const
,则mT
将与T
相同,并且两个newCpy
将具有完全相同的签名Foo
无权访问Foo::var
有什么办法可以解决这个问题吗?可以使用元函数
条件实现常量类型限定符的反转:
但是,以下代码需要C++17转换为C++14,只需将出现的\u 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>>;
static Foo<T> * newCpy(const Foo<invert_cv<T>> * foo) {
return new Foo(new T(*(foo->var)), true);
}