const正确性和模板参数

时间:2012-08-02 14:12:00

标签: c++

如果您想了解一些背景故事,请参阅this question

我想将事物作为不可变数据传递。

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

A<int> a;
a.send(1);

到目前为止,这么好。我只是发送了一个常量值但是当我使用指针时,事情变得棘手。

A<int *> a;
int b = 1;
a.send(&b);

我最终得到的是:

void send(int *const & value)

我现在传递的指针无法作为引用进行更改,但可以更改此指针指向的内容。这是正确的,但我想表示你不能修改这个指针所指向的内容。

我的目的是让事情变得一成不变但这有可能吗?

2 个答案:

答案 0 :(得分:3)

您可以将a声明为

A<const int *> a;

答案 1 :(得分:3)

如果我理解正确,你基本上想要一个指针专门化,那么如何:

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