如何区分构造函数

How to differentiate between constructors

本文关键字:构造函数 何区      更新时间:2023-10-16

>我在类模板中有两个构造函数,一个带有数组,一个以向量作为参数。

我有指向给定参数的指针成员。

我必须重载 operator[] 和 write size(( 方法(每个只有一个(,它们适用于两者,但我不知道如何区分给定的类型。

如何知道调用了哪个构造函数?

提前谢谢。

template<typename T, typename F>
class view {
const T* arrayT;
const std::vector<T>* vectT;
size_t* sizeArray;
F functor{};

view(const T array[], rsize_t sze) {
arrayT = array; 
sizeArray = &sze; 
}
view(const std::vector<T> vect) {
vectT = &vect;
}

int size() const{
if( ?????){
return sizeArray;
} else {
return vecT-> size();
}
}
T view<T, F>::operator[](int index) const {
if(????) {
functor(arrayT[index]);
} else {
return functor(vectT->at(index));
}
}

如果你正在做 c++17,我建议你看看constexpr如果 https://en.cppreference.com/w/cpp/language/if#Constexpr_If

它是一种新的语言功能,可让您在编译时执行。

您可以在类级别拥有私有bool flag,并根据所调用的构造函数将其设置为falsetrue

差异可以很容易地看到,因为一个参数采用两个参数,另一个只接受一个参数,因此可以预测构造函数调用。

class view {
bool flag;    
const T* arrayT;
const std::vector<T>* vectT;
size_t* sizeArray;
F functor{};
/// Accepts two arguments
view(const T array[], rsize_t sze) {
flag = true;
arrayT = array; 
sizeArray = &sze; 
}
/// Accepts one argument
view(const std::vector<T> vect) {
flag = false;
vectT = &vect;
}
int size() const {
if (flag) {
return sizeArray;
} else {
return vecT-> size();
}
}
T view<T, F>::operator[](int index) const {
if (flag) {
functor(arrayT[index]);
} else {
return functor(vectT->at(index));
}
}
}

不应使用两个指针。您也可以定义更多构造函数。

template<typename T, typename F>
class view {
const T* arr;
size_t size;
F functor;
view(const T arr[], size_t size) : arr(arr), size(size) {}
template <size_t N>
view(const T (&arr)[N]) : arr(arr), size(N) {}
view(const std::vector<T> & vec) : arr(vec.data()), size(vec.size()) {}
template <size_t N>
view(const std::array<T, N> & arr) : arr(arr.data()), size(N) {}
int size() const { return size; }
std::invoke_result_t<F, T> operator[](int index) const { return functor(arrayT[index]); }
};