假设我们有一个带有运算符[]的类,如下
class MyClass
{
//...
public:
TYPE operator[](const size_t idx) const
{
//... Implementation
}
}
现在我想读取TYPE
,并将其用作另一个类的模板参数。可以使用技巧
template<class T>
class OtherClass
{
//...
}
template<class T>
auto generator(const T& element)
{
return OtherClass<T>();
}
int main(void)
{
MyClass myclass;
auto resulted_class = generator(myclass[0]);
return 0;
}
这应该从MyClass
创建一个具有模板TYPE
的OtherClass
,并将其复制到resulted_class
中。
现在是问题。对于索引值0或任何特定的索引值,是否可以实现相同但不通用调用[]运算符的结果?重点是不能保证运算符[]是为特定值定义的。如果可能的话,我们只需要提取TYPE
。
换句话说,如果我们使用像std::vector<double>
这样的类,我们希望从该类中提取double
。但对CCD_ 9没有进一步的了解。我们唯一知道的是,里面有一个[]运算符的定义。
是:
using T = std::decay_t<decltype(myclass[0])>;
不计算decltype
内部的表达式。事实上,您不需要一个实例:
using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;
参见std::decay
、decltype
和std::declval