ページ 11

空のstringの表し方について

Posted: 2013年6月10日(月) 23:32
by dom
ファイルを読み込んでデータを構築してからそのハンドルを返すために以下のような関数を作りました。
対応するファイルを読み込まないときは0(null)を与えます。

コード:

Handle loadFiles(const char* vert,  const char* geom, const char* frag, const char* tess=0);
今、引数がstd::string型の方が便利だと考え以下のように変更したいと思っています。
その場合、対応するファイルを読み込まないようにするためにはどうすれば良いでしょうか。
思いつくのは0の代わりに""なのですが、なんだか恰好悪いので何か良い方法があればお願いします。

コード:

Handle loadFiles(const string& vert,  const string& geom, const string& frag, const string& tess="");

Re: 空のstringの表し方について

Posted: 2013年6月10日(月) 23:37
by h2so5

コード:

Handle loadFiles(const string& vert,  const string& geom, const string& frag, const string& tess);
Handle loadFiles(const string& vert,  const string& geom, const string& frag);
このように2種類用意すればいいとおもいます。
それとも途中の引数も省略したいということでしょうか?

Re: 空のstringの表し方について

Posted: 2013年6月10日(月) 23:56
by dom
返信ありがとうございます。
途中の式も含めて考えています。数種類用意する必要がありますがそれも一考してみます。

Re: 空のstringの表し方について

Posted: 2013年6月11日(火) 00:07
by h2so5
無理に一つの関数にまとめないほうが良いのでは?素直にこういう実装でもありだと思います。

コード:

Handle loadVertFile(const string& vert);
Handle loadGeomFile(const string& geom);
Handle loadFragFile(const string& frag);
Handle loadTessFile(const string& tess);
[追記]
これだとハンドルが複数になってしまうので、それを回避するならこんな感じにクラスメンバとして実装するという手もあります。

コード:

class Shader {
public:
    void loadVertFile(const string& vert);
    void loadGeomFile(const string& geom);
    void loadFragFile(const string& frag);
    void loadTessFile(const string& tess);
};
[追記]
オプショナルな変数ということであればBoost.optionalなども有りますが、今回の場合は有用ではないでしょう。

Re: 空のstringの表し方について

Posted: 2013年6月11日(火) 10:51
by usao
どのファイルも 読むか読まないかはその時次第 とかであれば

コード:

Handle CreateDefaultData();  //全くファイルを用いない状態でのデータ構築
Handle loadVertFile( Handle, const string& vert);  //Handleで指定されたデータについて VertFile の領分だけを変更
Handle loadGeomFile( Handle, const string& geom);
Handle loadFragFile( Handle, const string& frag);
Handle loadTessFile( Handle, const string& tess);
とかでどうでしょう?

Re: 空のstringの表し方について

Posted: 2013年6月11日(火) 15:31
by dom
これだとハンドルが複数になってしまうので、それを回避するならこんな感じにクラスメンバとして実装するという手もあります。

コード:

class Shader {
public:
    void loadVertFile(const string& vert);
    void loadGeomFile(const string& geom);
    void loadFragFile(const string& frag);
    void loadTessFile(const string& tess);
};

やはりそうなりますよね。元々はclass Shaderのようなものがあり、毎回指定するのが面倒だったので
ヘルパー関数

コード:

Shader*  loadFiles(const string& vert,  const string& geom, const string& frag, const string& tess);
を作ってみたのですが・・・
少し考えてconst char*版の内部で文字列処理してしまおうという結論に至りました。
どうもお騒がせしました。