У меня есть следующий класс:
template <size_t size>
class Araye{
public:
Araye(int input[]){
for (int i=0;i<size;i++)
araye[i]=input[i];
}
int araye[size];
};
Как должен я писать cast-to-reference-to-array оператор для этого класса так, чтобы следование работало:
int adad[3]={1,2,3};
Araye<3> araye(adad);
int (&reference)[3]=araye;
template <size_t size> class Araye {
public:
typedef int (&array_ref)[size];
operator array_ref () { return araye; }
// ...
Или с помощью identity
(спасибо Йоханнесу):
operator typename identity<int[size]>::type &() { return araye; }
С этим ваш пример работает, но я бы предпочел следующее объявление вместо этого:
Araye<3>::array_ref reference = araye;
Обычно в этом нет необходимости, так как оператор subscripting покрывает большинство потребностей:
int& operator[](size_t i) { return araye[i]; }
Обратите внимание, что если вы согласны ограничить свой класс агрегатом, вы можете сократить ваш пример до следующего:
template <size_t size> struct Araye {
int araye[size];
typedef int (&array_ref)[size];
operator array_ref () { return araye; }
};
Araye<3> araye = {1,2,3};
Araye<3>::array_ref reference = araye;
Вы могли бы использовать функциональность boost::array, также найденную в TR1 и, по расширению, C++0x.