C++ 常量正确性和模板参数

C++ 常量正确性和模板参数,c++,C++,请看你是否想了解一些背景故事 我想把东西作为不可变的数据传递 template<class T> class A { public: void send(const T& value); }; A<int> a; a.send(1); 我现在传递的指针不能作为引用更改,但该指针指向的内容可以更改。这是正确的,但我想表示,您不能修改此指针指向的内容 我在这里的意图是使事物不可变,但这可能吗?您可以将a声明为 A<const int

请看你是否想了解一些背景故事

我想把东西作为不可变的数据传递

template<class T>
class A
{
    public:
        void send(const T& value);
};

A<int> a;
a.send(1);
我现在传递的指针不能作为引用更改,但该指针指向的内容可以更改。这是正确的,但我想表示,您不能修改此指针指向的内容


我在这里的意图是使事物不可变,但这可能吗?

您可以将
a
声明为

A<const int *> a;
A;

您可以将
a
声明为

A<const int *> a;
A;

如果我理解正确,您基本上想要一个指针专业化,那么这个怎么样:

template <typename T>
struct Immutable {
  typedef T const& Type;
};

template <typename U>
struct Immutable<U*> {
  typedef U const* Type;
};

template<class T>
class A {
  public:
    void send(typename Immutable<T>::Type);
};
模板
结构不可变{
typedef T const&Type;
};
样板
结构不可变{
类型定义U常量*类型;
};
样板
甲级{
公众:
void send(typename不可变::Type);
};

如果我理解正确,您基本上想要一个指针专业化,那么这个怎么样:

template <typename T>
struct Immutable {
  typedef T const& Type;
};

template <typename U>
struct Immutable<U*> {
  typedef U const* Type;
};

template<class T>
class A {
  public:
    void send(typename Immutable<T>::Type);
};
模板
结构不可变{
typedef T const&Type;
};
样板
结构不可变{
类型定义U常量*类型;
};
样板
甲级{
公众:
void send(typename不可变::Type);
};

好的,但这会改变语义。类
A
引入的任何常量限定符现在都是多余的。如果有一个函数并不意味着不可变,它就不能再修改该值,因为它的类型已被该类型的用户设置为常量。@JohnLeidegren:不,由class
a
引入的常量限定符适用于参数(
const int*const&
).@JohnLeidegren我明白你的意思,它看起来像是一个按照bitmask提出的专门化思路的解决方案。好吧,但这改变了语义。类
A
引入的任何常量限定符现在都是多余的。如果有一个函数并不意味着不可变,它就不能再修改该值,因为它的类型已被该类型的用户设置为常量。@JohnLeidegren:不,由class
a
引入的常量限定符适用于参数(
const int*const&
)@JohnLeidegren我明白你的意思,它看起来像是一个按照bitmask提出的专门化思路的解决方案。好吧,这看起来很有希望。你知道STL中是否有类似的内容吗?@EricFinn我想如果你带有常量引用的语义,你也应该防止意外赋值。@Johnleidern:不,我不这么认为。我想这不是一个很普遍的问题。最接近的是:
删除指针
+
添加常量
+
添加左值引用
,但你总是会得到常量&,即使
T
是指针类型。我有点觉得我在试图解决一个不需要解决的问题…@JohnLeidegren:我同意。即使我看了你的背景问题,我也不知道为什么这会有用。也许你的设计还有其他问题?好吧,这看起来很有希望。你知道STL中是否有类似的内容吗?@EricFinn我想如果你带有常量引用的语义,你也应该防止意外赋值。@Johnleidern:不,我不这么认为。我想这不是一个很普遍的问题。最接近的是:
删除指针
+
添加常量
+
添加左值引用
,但你总是会得到常量&,即使
T
是指针类型。我有点觉得我在试图解决一个不需要解决的问题…@JohnLeidegren:我同意。即使我看了你的背景问题,我也不知道为什么这会有用。也许你的设计还有其他问题?