English 中文(简体)
缩略语 班级
原标题:STLifying C++ classes

I m 试图撰写一个包含以下几个方面的内容:作为数据成员的探测器,并提供病媒界面的子集,以获取:

class Mesh
{
public:
private:
  std::vector<Vector3> positions;
  std::vector<Vector3> normals;
  // Several other members along the same lines
};

你可以做的一件小事是增加职位、正常职位和其他困难。 为了便于使用类似于STL的方法(除阵列、其他集装箱等外),我赞成增加类似方法的想法:

public:
  template<class InIter>
  void AddNormals(InIter first, InIter last);

问题在于,从我对模板的理解来看,这些方法必须在标题档案中加以界定(要说是有意义的;如果没有具体的变体类型,汇编者就知道如何为这一方法的明显实施制定目标代码)。

  1. 这实际上是否是一个问题? 我的冷静反应不是要 around在头版档案中大量编码,而我的C++是一小rus,在玩具实例之外,没有太多的STL经验,我不肯定“可接受的”C++编码做法是什么。

  2. Is there a better way to expose this functionality while retaining an STL-like generic programming flavour? One way would be something like this:

(最后名单)

class RestrictedVector<T>
{
public:
  RestrictedVector(std::vector<T> wrapped)
    : wrapped(wrapped) {}

  template <class InIter>
  void Add(InIter first, InIter last)
  {
    std::copy(first, last, std::back_insert_iterator(wrapped));
  }

private:
  std::vector<T> wrapped;
};

而后又暴露了Mesh的这些事例,但这种情形开始重新研究一些过度开采的情况。 任何建议都受到高度赞赏。

最佳回答

这些方法必须在标题文件中界定。

必须在a>上界定标题,这样,如果重新使用,就可在模板功能的翻译单位查阅。 如果你重新对头盔档案中太多的模板表示担忧,从而延缓了使用Mesh但实际上没有使用该模板功能的翻译单位的汇编,那么,你可以把执行变成一个单独的头盔文件。 使客户的生活更加复杂,决定是否包括“完全的脂肪”类头盔,但实际上并不困难。

或者,就这一特殊例子而言,你可以确定一个对准的Mesh的产出探测器。 之后,客户及其专断者可以做:

std::copy(first, last, mymesh.normalAdder());

唯一需要使用模板代码的负责人是:<algorithm>,很有可能已经这样做。

为做到这一点,通过<代码>诺热/代码>退回的物体需要上载<代码>operator++()和operator*(,后者本身需要交还一个代用物体(通常*this),执行operator=(const &Vector3)。 这反映了正常的病媒。 但所有这一切都是非典型守则,可在你档案中执行。

在此例子中,normalAdder(>仅可返回std:back_inserter(this.normals);, 模板来自<iterator>

关于您是否需要对此表示担忧——我想,在汇编时间时,由于不必要的依赖,而不是由于头盔中模版编码的细微缩略因素,情况更加频繁。 一些大型项目似乎需要采取严厉措施,但我个人却拿不到100多份档案。

问题回答

d 我仅指子弹,并作干净、可读、APIC/header。

“Steve”关于退还产出探测器的想法已经过时,但对于贵阶层的客户来说,这种想法将具有对抗性。 当有人想增加一些正常情况时,他们就认为“如果是增加正常情况的方法”,而不是“我获得正常产出的催化剂”。 (除非您在Allpro-STL shop.)

可以通过将其移至“类别声明”之外,在一定程度上减少对头盔采用模板方法的要求。

class Mesh
{
    public:
        void    AddPosition     ( Vector3 const & position );
        void    AddNormal       ( Vector3 const & normal );

        template< typename InIter >
        void    AddPositions    ( InIter const begin, InIter const end );

        template< typename InIter >
        void    AddNormals      ( InIter const begin, InIter const end );

    private:
        std::vector< Vector3 > positions;
        std::vector< Vector3 > normals;
};

template< typename InIter >
void
Mesh::AddPositions< InIter >( InIter const begin, InIter const end )
{
    positions.insert( positions.end(), begin, end );
}

template< typename InIter >
void
Mesh::AddNormals< InIter >( InIter const begin, InIter const end )
{
    normals.insert( normals.end(), begin, end );
}
  1. Is this actually a problem? My gut reaction is not to go around sticking huge chunks of code in header files, but my C++ is a little rusty with not much STL experience outside toy examples, and I m not sure what "acceptable" C++ coding practice is on this.

我 ask问你是否需要这种通用性? 作者认为,“STL”一词对于每个人的需要来说是极为笼统的。 你的守则是你和你的团队解决一个非常具体的问题。 非遗传性的、针对具体问题的接口将进行细致的工作,并且对贵团队/问题领域的人更加清楚。

否则,如果你需要这种通用性水平的话,你所说的话是巨大的。 您允许任何激光器类型作为论据接受。 你们面对这一点没有任何错误。 这非常有用。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签