让我们有一个具有operator []的类TArray
。 Tarray[index]
的返回类型已知,我们称之为TResult
,但index
本身的类型TIndex
,我想知道。为此,我已经确定了
以下模板。
template<class TArray, class TResult>
struct ArrayIndexType
{
template<class TIndex>
using OperatorFunc = TResult(TArray::*)(TIndex);
template<class TIndex>
static TIndex test(OperatorFunc<TIndex>);
using type = decltype(test(&TArray::operator[]));
};
它实际上适用于std :: vector:
cout << typeid(ArrayIndexType<vector<double>, /*TResult=*/double&>::type).name();
// output: unsigned int.
但是当我为最简单的继承做同样的事情时:
class DoubleVec: public vector<double>
{};
cout << typeid(ArrayIndexType<DoubleVec, /*TResult=*/double&>::type).name();
我得到编译错误C2664:&#39; TIndex ArrayIndexType :: test(TResult(__ thistall DoubleVec :: *)(TIndex))&#39; :无法从&#39;重载函数&#39;转换参数1 to&#39; double&amp;(__ thiscall DoubleVec :: *)(unsigned int)&#39;
这基本上意味着编译器无法在向量:double& vector::operator[](size_t)
和const double& vector::operator[](size_t)
中定义的operator []的2个重载之间进行选择。
这是MSVS 2013中的错误还是我做错了什么?
也许有更好的方法来实现目标,即获得operator []的参数类型? 谢谢你的回答。
答案 0 :(得分:1)
这不是一个错误。 &DoubleVec::operator[]
的类型仍然是&#34;指向std::vector<double>
&#34;的成员函数的指针,并且编译器无法推导出指向{{的成员函数的&#34;指针1}}&#34;从它。
对于标准容器来说,这几乎都是毫无意义的:
DoubleVec
或者,类类型上的模板template<class T>
using ArrayIndexType = typename T::size_type;
也是:
OperatorFunc