パスワードを忘れた? アカウント作成
497583 journal

tarosukeの日記: [talos]ハッシュなmap 2

日記 by tarosuke

とか書いてるわけだが、仮想関数のテンプレートなるものが必要に...そんなもの書けるのか?テンプレートはinlineが前提だから書けないような気がするが、基底クラスから派生クラスを呼ぶ方法は仮想関数しかない。宣言だけならできるかな?(ぉ

それにしても、やはりテンプレートは禁断の扉だよなぁ...字面がコンパクトだからつい使っちまうけど実はバイナリが大変な事に...なんてなりそう。

--
仮想関数のテンプレートは不可のようだ。やりたきゃクラスごと...って事か。そんなの複数キーを素直に使えなくてイヤン。

--
てゆーかクラスごとでもむりぽ。テンプレートだと何一つ実体を書けねーよ...orz

--
とゆーわけでSTLではどうやってるのかなー?と調べてみたんだけど...これはあり得ないな。「オブジェクト指向」って大声でガナってる奴のコードって、大抵クラスやオブジェクトを作りすぎでちっともオブジェクトがオブジェクトになってないの。デザインパターンもそう。C++が今みたいな評価になってるのは彼らがそんな事してきたから。同じ事するのにCのライブラリより頭使わなきゃ使えないライブラリに存在意義なんてあんのかよ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2007年04月07日 14時08分 (#1138890)
    テンプレートを inline にする必要はないのでは (速度効率は悪くなるが) 。
    外しているかもしれないので AC 。

    -- main.cc begin --
    #include <string>
    #include <memory>
    #include "cls.h"
     
    int main()
    {
      std::auto_ptr<Foo<int> > a(new Foo<int>(0));
      a->hello();
     
      std::auto_ptr<Foo<std::string> > b(new Bar<std::string>("str"));
      b->hello();
     
      std::auto_ptr<Foo<char> > c(new Baz<char>('c'));
      c->hello();
     
      return 0;
    }
    -- main.cc end --

    -- cls.h begin --
    #ifndef CLS_H
    #define CLS_H
     
    #include <iostream>
    #include <string>
     
    template <typename T>
    class Foo
    {
    public:
      Foo(T t) { t_ = t; }
      virtual ~Foo() { }
      virtual void hello();
     
    protected:
      virtual T value();
     
    private:
      Foo();
      Foo(const Foo&);
      Foo& operator=(const Foo&);
     
      T t_;
    };
     
    template <typename T>
    class Bar : public Foo<T> {
    public:
      Bar(T t) : Foo<T>(t) { }
      virtual ~Bar() { }
      virtual void hello();
     
    private:
      Bar();
      Bar(const Bar&);
      Bar& operator=(const Bar&);
    };
     
    template <typename T>
    class Baz : public Foo<T>
    {
    public:
      Baz(T t) : Foo<T>(t) { }
      virtual ~Baz() { }
      virtual void hello();
     
    private:
      Baz();
      Baz(const Baz&);
      Baz& operator=(const Baz&);
    };
     
    template <typename T>
    T Foo<T>::value()
    {
      return t_;
    }
     
    template <typename T>
    void Foo<T>::hello()
    {
      std::cout << "I am Foo. The value is " << this->value() << std::endl;
    }
     
    template <typename T>
    void Bar<T>::hello()
    {
      std::cout << "I am Bar. The value is " << this->value() << std::endl;
    }
     
    template <typename T>
    void Baz<T>::hello()
    {
      std::cout << "I am Baz. The value is " << this->value() << std::endl;
    }
     
    #endif
    // CLS_H
    -- cls.h end --
typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...