添加无模板实例化的访问者方法
Add accessor method without template instantiation
i具有由模板类型制成的结构,除非实例化,否则与不完整类型一起使用,例如std::vector
。访问这些类型的类型使用类型Aftex索引包装器。示例:
template<class T>
struct Idx{unsinged val;};
struct Holder{
MyVector<Foo> foos;
MyVector<Bar> bars;
};
const Foo& foo = holder.foos.get(Idx<Foo>(...));
这效果很好:Idx
不需要知道模板参数的类型,因为它从未使用过。持有人也可以与Foo/bar的前瞻性声明一起工作。我不能将Idx<Foo>
与Idx<Bar>
混淆,因为我只能与它们相应的类型。因为这是如此独特,但我将便利功能添加到持有人:
struct Holder{
MyVector<Foo> foos;
MyVector<Bar> bars;
const Foo& get(Idx<Foo> idx) { return foos.get(idx);}
const Bar& get(Idx<Bar> idx) { return bars.get(idx);}
};
,但是现在我需要为持有人提供完整的类型,我想避免使用。是否可以使用不完整的类型和便利功能?也许有些模板有所帮助,但我需要对Foos或最有可能实例化的酒吧进行一些派遣。
也许您可以创建模板函数
template<typename T>
const T& getByIndex(const MyVector<T>& vec, const Idx<T>& idx)
{ return vec.get(idx); }
然后您可以在Holder
中使用它,例如
const Foo& get(const Idx<Foo>& idx) { return getByIndex(foos, idx); }
不要指望参数作为实例Idx<Foo>
,因为这需要完全定义的类型(参考允许不完整的类型)。
我在讨论的讨论中找到了一个解决方案,然后由 @grek40:
我需要一个模板化的获取功能,以便容器获取功能不会在标题中实例化。因此我们有:
template<class T> const T& get(DescIdx<T> idx) const { return getContainer<T>().get(idx); }
现在我们需要一个简单的getContainer
功能:template<class T> const MyVector<T>& getContainer() const;
需要对我们的容器进行实例化:template<> inline const MyVector<Foo>& Holder::getContainer() const { return foos; }
总的来说:
template<class T>
struct Idx{unsinged val;};
struct Holder{
MyVector<Foo> foos;
MyVector<Bar> bars;
template<class T> const T& get(DescIdx<T> idx) const { return getContainer<T>().get(idx); }
template<class T> const MyVector<T>& getContainer() const;
};
template<> inline const MyVector<Foo>& Holder::getContainer() const { return foos; }
template<> inline const MyVector<Bar>& Holder::getContainer() const { return bars; }
// Somewhere else
const Foo& foo = holder.get(Idx<Foo>(...));
使用模板元编程可以改善这一点。步骤:
- 定义一个boost :: mpl ::所有类型的列表(foo,bar)
- 创建一个存放1
MyVector<T>
的模板结构 - 让持有人从每种类型实例化的
MetaHolder
继承 - 实现1(!)通用getContainer函数,只需返回
MetaHolder<T>.container
。
MetaHolder
在编译时一切都会解决,因此没有运行时开销。不确定要编译时间开销,因为boost.mpl会变得很重。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 访问者访问变体并返回不同类型时出错
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 添加无模板实例化的访问者方法
- 在何处定义访问者方法