gpt4 book ai didi

c++ - 将 const 指针参数传递给模板类的成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:17 24 4
gpt4 key购买 nike

考虑以下类:

template<typename T> class A{
public:
virtual void foo(const T& v){ m_v = v + 1; }
T& bar(){ return m_v;}
T m_v;
// ... other member functions/variables ...
};

如何对其进行修改以使以下代码有效(如果可能,则不必在 const_cast 上使用 p):

int main(){
A<int*> a;
const int* p = nullptr;
a.foo(p);
a.bar();

A<int>().foo(10);
}

问题是 foo 的签名方法,当Aint* 模板化据我所知,变成了foo(int* const&) .我们想要的是 foo(const int* const&) .

到目前为止,我考虑过添加一个专门的 foo 实现A 的成员函数由类声明之外的指针类型模板化(就像专门化 A<int>::foo 一样),但编译器无法将函数定义原型(prototype)解析为声明的方法。

template<typename T>
void A<T*>::foo(const T* const& ){}

gcc 提示它是一个 invalid use of incomplete type ‘class A<T*>’

我还考虑过为指针类型的整个类添加部分特化,它定义了一个额外的成员重载 foo接受 const T* ,但我无法弄清楚如何重用基本模板中的其余代码(即不复制所有其他函数的声明和定义,例如 bar )。有没有一种方法可以从指针偏特化中引用基模板类,或者是为了继承,或者是为了让一个成员转发调用? (This post 通过添加额外的虚拟模板参数提供了解决方案。有没有办法规避这个问题?)。

最后,我也考虑过使用 enable_if<is_pointer<T>::value, void>::type foo(const PointedToType*);foo 添加额外的重载模板参数是指针时的方法,但是如何获得PointedToType来自 T (当知道 T 是指针类型时)?

最佳答案

在我看来,您只需要一个特征来说明 foo 的参数类型应该是什么:

template <typename T>
struct arg_type { using type = T const&; };

template <typename T>
struct arg_type<T*> { using type = T const*; };

template <typename T>
using arg_type_t = typename arg_type<T>::type;

这样使用:

virtual void foo(arg_type_t<T> arg ) {}

关于c++ - 将 const 指针参数传递给模板类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31418114/

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