C#에서의 ArrayList를 C++에서 구현

hol_ding의 이미지

C#에서의 ArrayList는 데이터 타입을 따지지 않고 넣을수 있는데,
C++에서 이걸 구현할수는 없는건가요?
아니면 데이터 타입을 따지지 않는 컨테이너가 이미 있나요?

gilgil의 이미지

C++의 generic programming에서는 compile time에 type이 정해 지게 됩니다(runtime에 정해 지는 게 아니고).
예를 들면 list 혹은 list과 같이 아래와 같이 써야 하죠.

  list<int> intList;
  list<string> stringList;

만약에 date type을 명시하지 않으려면 모든 type을 포함하는 type을 사용하면 됩니다.

플랫폼(라이브러리)마다 다른데, Qt의 경우에는 QVariant를 사용하면 되고, 직접 구현하려면 구글링해 보시면 나와 있습니다.
http://www.codeproject.com/Articles/6462/A-simple-class-to-encapsulate-VARIANTs

klara의 이미지

C#에서 하는 만큼 하면 C++에서도 구현할 수 있지요.
가장 간단한 방법은 void*를 이용해서 아무거나 다 담아버리는 거지만, 이렇게 하면 타입안전성을 보장하기 힘들기 때문에, C++에서도 C#처럼 모든걸 담을수 있는 오브젝트 클래스(인터페이스가 더 적합할 수도 있습니다)를 만들고, 오브젝트클래스를 담을 수 있는 배열이든 리스트든 만들면 됩니다.
당연히 오브젝트 클래스는 모든 타입에 대해서 구현되어야하겠지요.
예를 들면,

class Loadable {
  virtual ~Loadable() {}
};
 
class SomeClass {
  ...
};
 
class LoadableSomeClass : public SomeClass, public Loadable {
public:
  LoadableSomeClass(const SomeClass &value): SomeClass(value) {}
};
 
class LoadableInt : public Loadable {
public:
  LoadableInt(int value = 0): value(value) {}
  int operator() () const {return value;}
  int value;
};
 
class ArrayList {
  ...
  void append(int i, Loadable *item) {m_array[i] = item;}
  Loadable *get(int i) const {return m_array[i];} 
private:
  std::vector<Loadable*> m_array;
};
 
int main() {
  ArrayList list;
  list.append(new LoadableSomeClass(SomeClass(...)));
  list.append(new LoadableInt(2));
  ...
}

뭐 이런식으로 되겠죠? ArrayList처럼 첨자 넣으면 자동으로 확장되게 하고 싶다면 ArrayList의 컨테이너로 벡터가 아니라 std::map 같은 걸로 하면 구현은 더 편할테구요.
dynamic_cast나 타입을 나타내는 메타클래스같은걸 Loadable에 넣어두면 형변환 체크도 가능할 겁니다.
동적바인딩을 이용하기 때문에 포인터를 타입으로 받고 있으므로, 그부분은 명세에 적어둬야 할 겁니다.
아니면 스마트포인터를 이용하는 방법도 있을테고요...
요구하는 구체적인 내용에 따라서 단순하게 만들수도 있고, 템플릿도 섞어서 좀더 다양한 기능이나 편리한 기능 지원하게 만들수도 있을겁니다.
어찌되었든, 적재하고 싶은 모든 타입에 대해서 새롭게 Loadable을 상속한 클래스를 만들거나, 모든 타입을 기술할 수 있는 메타 클래스를 만들거나 해야할겁니다.

hol_ding의 이미지

좋은 정보 주신점 아주 감사드립니다.

"Success"

yielding의 이미지

Life rushes on, we are distracted

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.