gpt4 book ai didi

c++ - 处理模板参数中的 cv 修饰符

转载 作者:行者123 更新时间:2023-11-28 04:16:14 24 4
gpt4 key购买 nike

我正在尝试实现某种用于内存管理目的的包装器模板:

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

然而,这不起作用有两个原因:

  1. 如果 T不是 const , 然后 mT将与 T 相同, 和两个 newCpy结果将具有完全相同的签名。

  2. Foo<T>无权访问 Foo<mT>::var

有什么办法解决这个问题吗?

最佳答案

使用元函数 conditional 可以实现 const 类型限定符的反转:https://en.cppreference.com/w/cpp/types/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);
}

在您给出的示例中,不清楚您打算删除 volatile 限定符,但是,如果我只是误解了预期的用例,则可以通过以下方式进行类似的反转:

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

关于c++ - 处理模板参数中的 cv 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com