Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板参数中处理cv修饰符_C++_Templates_Constants - Fatal编程技术网

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);
    }