2010/08/10


「new 式」 で、変数を 式 として指定することはできますか? | OKWave
via: ときどきの雑記帳
ところでpermalinkがおかしい気がする。あと最近のときどきの雑記帳はときどきどころでない気がするw
「new 式」 で、変数を 式 として指定することはできますか?

例えば次のような感じで、変数clの内容によりclassAあるいはclassBをnew
するようなことがしたいです。
class base [ ... };
class classA : public base { .... };
class classB : public base { .... };
classA* ca;
classB* cb;
base* cl;
cl = classA;
ca = new cl;
cl = classB;
ca = new cl;

これにより、多種のclassをnewする際にいちいち
pa = new classA;
pb = new classB;
pc = new classC;
pd = new classD;
............
としないで、
for (n=0; n<xxx; n++)
p[n] = new cl[n];
…みたいに簡潔に書けないかなと考えてます。
よろしくお願いします。
こんな?
#include <iostream>

using namespace std;

class base {
public:
    virtual void hello() const =0;
};

class classA : public base { void hello() const { cout << "classA\n"; }};
class classB : public base { void hello() const { cout << "classB\n"; }};
class classC : public base { void hello() const { cout << "classC\n"; }};
class classD : public base { void hello() const { cout << "classD\n"; }};

template<typename T> base* create() {
    return new T;
}

int main(){
    typedef base* (*factory)();
    factory p[] = {
        create<classA>,
        create<classB>,
        create<classC>,
        create<classD>
    };
    for (int n = 0; n < 4; n++)
        p[n]()->hello();
}
Posted at by



2010/07/31


まぁネタですが...
mattn's go-translate at master - GitHub

google language translate library

http://github.com/mattn/go-translate
これ使うと println(translate.Translate("en", "ja", "i'm zakarite what is emperor in cosmic")) こんなコードで 私は宇宙の皇帝zakariteよ こんな結果が得られます。
便利ですね!

あっ歳ばれる。
ちなみにどうやっても帝王って出せないんですけど...
Posted at by



2010/07/29


Goは型宣言無しに値が代入出来てしまうので、カーソル上の変数から型推測する必要がある補完は難しいんじゃないかなーと思ってたら、なんと作った人がいました。
すげー。

nsf's gocode at master - GitHub

Autocompletion/refactoring daemon for Go language.Work in progress..Currently available things: - .a...

http://github.com/nsf/gocode
仕組みはvimスクリプト内でデーモン起こしてコードとキーワードと共にサーバ側でコンパイルし、解析して返すというもの。通信にはRPCが使われている。
補完はomniなので<c-x><c-o>で開始。ちゃんと
  • インスタンスメソッド一覧
  • 構造体のメンバ
  • パッケージ内の定数や型、関数
gocode1

もろもろ補完してくれる。私が無理かもねと思ってた以下の様なコードでもしっかり補完してくれている。すばらしい。

gocode2

Go書く人はいれるべし。ちなみにこのgocode、出力形式としてemacsもサポートしている(未確認)ので、ぜひ試して欲しい。

追記
さすがにこういうコードは難しいみたい。なんかPANICって補完されてます。

package main

type Foo struct {
    Boo func();
    Baz string;
}

func foo() *Foo {
    return &Foo {}
}

func main() {
    foo().PANIC
}

Posted at by