template<class T, int...Shape>
class Array {
template<int>using index_t=int; // can change this
public:
T& operator()(index_t<Shape>... is);
};
or:
template<class T, int...Shape>
class Array {
public:
T& operator()(decltype(Shape)... is);
};
or:
template<class T, int...Shape>
class Array {
public:
T& operator()(decltype(Shape, int())... is);
};
если вы хотите иметь возможность изменить тип параметра, чтобы он отличался от Shape
.
Я считаю, что decltype
сложнее понять прикосновение, чем using
, особенно если вы хотите изменить тип параметра, чтобы он отличался от int
.
Другой подход:
template<class T, int...Shape>
class Array {
public:
template<class...Args,class=typename std::enable_if<sizeof...(Args)==sizeof...(Shape)>::type>
T& operator()(Args&&... is);
};
который использует SFINAE. Однако это не гарантирует, что Args
являются целочисленными типами. Мы могли бы добавить еще один пункт, если бы захотели (скажем, все Args
можно преобразовать в int
).
Еще один подход состоит в том, чтобы ваш operator()
принимал пакет значений, например std::array<sizeof...(Shape), int>
. Звонящие должны были:
Array<double, 3,2,1> arr;
arr({0,0,0});
используйте набор {}
s.
Окончательный подход будет следующим:
template<class T, int...Shape>
class Array {
public:
template<class...Args>
auto operator()(Args&&... is) {
static_assert( sizeof...(Args)==sizeof...(Shapes), "wrong number of array indexes" );
}
};
где мы принимаем что-либо, затем генерируем ошибки, если это неправильное количество аргументов. Это генерирует очень чистые ошибки, но не выполняет правильную перегрузку оператора SFINAE.
Я бы порекомендовал диспетчеризацию тегов, но я не вижу способа сделать ее намного чище, чем решение SFINAE, с дополнительными decltype
и всеми остальными или лучшими сообщениями об ошибках, чем версия static_assert
, с другой стороны.
person
Yakk - Adam Nevraumont
schedule
05.11.2014
T& operator()(decltype(shape)... args);
- person 0x499602D2   schedule 05.11.2014T& operator()(decltype(shape, X())... args);
для изменения типа. - person Deduplicator   schedule 05.11.2014int
. - person 0x499602D2   schedule 05.11.2014std::array
, вы можете сэкономить время с помощью трюк с псевдонимом вариативного массива. - person Casey   schedule 06.11.2014