Согласно стандарту, функция преобразования имеет функциональный идентификатор operator
идентификатор типа преобразования, который был бы похож, скажем, operator char(&)[4]
Я верю. Но я не могу выяснить, куда поместить список параметра функции. gcc не принимает ни один из operator char(&())[4]
или operator char(&)[4]()
или что-либо я могу думать.
Теперь, gcc, кажется, принимает (&operator char ())[4]
но лязг не делает, и я склонен к не также, так как это, кажется, не соответствует грамматике насколько я понимаю.
Я не хочу использовать a typedef
потому что я не хочу загрязнять пространство имен им.
Вы можете использовать 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
, я думаю.
C ++ не предоставляет для этого синтаксиса. Это один из тех случаев, когда у вас есть для использования typedef-name для типа.
Чтобы избежать загрязнения пространства имен, вполне нормально объявить typedef-name внутри класса
struct S {
int a[4];
typedef int A[4];
operator A&() { return a; }
};