Каков C++ ISO способ непосредственно определить функцию преобразования к ссылке на массив?

Согласно стандарту, функция преобразования имеет функциональный идентификатор operator идентификатор типа преобразования, который был бы похож, скажем, operator char(&)[4] Я верю. Но я не могу выяснить, куда поместить список параметра функции. gcc не принимает ни один из operator char(&())[4] или operator char(&)[4]() или что-либо я могу думать.

Теперь, gcc, кажется, принимает (&operator char ())[4] но лязг не делает, и я склонен к не также, так как это, кажется, не соответствует грамматике насколько я понимаю.

Я не хочу использовать a typedef потому что я не хочу загрязнять пространство имен им.

5
задан ben 10 April 2010 в 22:40
поделиться

2 ответа

Вы можете использовать identity

template<typename T>
struct identity { typedef T type; };

struct sample {
  operator identity<char[4]>::type &() {
    ...
  }
};

Вы правы, что деклараторы функций и массивов не будут работать в функциях преобразования. Это также известно и обсуждается в этом отчете о проблеме . Однако я думаю, что C ++ 0x уже предоставляет решение того, что они там обсуждают

struct sample {
  template<typename T>
  using id = T;

  template<typename T, int N>
  operator id<T[N]> &() {
    ...
  }
};

В отличие от подхода identity и typedef , это позволяет T и N , я думаю.

9
ответ дан 18 December 2019 в 14:43
поделиться

C ++ не предоставляет для этого синтаксиса. Это один из тех случаев, когда у вас есть для использования typedef-name для типа.

Чтобы избежать загрязнения пространства имен, вполне нормально объявить typedef-name внутри класса

struct S {
  int a[4];

  typedef int A[4];
  operator A&() { return a; }
};
4
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: