Mar*_*ník 1 c++ templates types operator-overloading auto
假设我们有一个带有运算符 [] 的类,如下所示
class MyClass
{
//...
public:
TYPE operator[](const size_t idx) const
{
//... Implementation
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想阅读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;
}
Run Code Online (Sandbox Code Playgroud)
这应该创建一个OtherClass
with 模板TYPE
fromMyClass
并将其复制到resulted_class
.
现在的问题。是否有可能实现相同但没有对索引值 0 或任何特定索引值的 [] 运算符的通用调用?关键是不能保证 operator [] 是为特定值定义的。TYPE
如果可能,我们只需要提取。
换句话说,如果我们使用一个类,就像std::vector<double>
我们想double
从那个类中提取它一样。但在没有进一步了解的情况下std::vector
。我们唯一知道的是其中有 [] 运算符的定义。
是的:
using T = std::decay_t<decltype(myclass[0])>;
Run Code Online (Sandbox Code Playgroud)
decltype
不计算内部的表达式。实际上,您不需要实例:
using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;
Run Code Online (Sandbox Code Playgroud)
见std::decay
,decltype
和std::declval