Допустим, у меня есть оболочка для массивов:
template <const size_t i,typename T>
class ArrayWrapper {
T arr [i] = {0};
public:
//constructors and operators like [] ...
void operator=(ArrayWrapper<i,T> & arrIn){
for (size_t k =0; k< i;k++){
arr[k] = arrIn[k];
}
}
};
Теперь я хочу иметь возможность назначать массивы другим массивам, например:
ArrayWrapper<2> arr1({1,2,3});
ArrayWrapper<2> arr2() = arr1;
Но теперь я хочудополнительно иметь возможность назначать более короткие массивы более длинным:
ArrayWrapper<3> arr1({1,2,3});
ArrayWrapper<4> arr2() = arr1;
здесь arr2 = {1,2,3,0}, но это не имеет смысла наоборот.
ArrayWrapper<3> arr1({1,2,3});
ArrayWrapper<2> arr2() = arr1;
Поскольку мы теряем информацию здесь. Как мне сказать компилятору не разрешать перегрузку этого с помощью j> i?
{...in ArrayWrapper class
template <size_t j>
void operator=(ArrayWrapper<j,T> & arrIn){
for (size_t k =0; k< j;k++){
arr[k] = arrIn[k];
}
}
...}
Я попробовал это:
template <size_t std::enable_if< j<=i>::j>
void operator=(ArrayWrapper<j,T> & arrIn){
for (size_t k =0; k< j;k++){
arr[k] = arrIn[k];
}
}
Но компилятор ненавидит это; (