コード
C++
1template<class Derived> 2class Base { 3private: 4 static const std::vector<const char*> paths; 5} 6 7class Derived1 : public Base<Derived1> { 8private: 9 static constexpr const char *path = "どこかのディレクトリへのパス1"; 10} 11class Derived2 : public Base<Derived2> { 12private: 13 static constexpr const char *path = "どこかのディレクトリへのパス2"; 14}
質問
上述のコードにおける Base::paths を Derived::path の中にあるファイル一覧で固定したいなと思っています。
探索は、実行時の一番初め、または、初めての実体化時に一度だけにしたいです。
(実行時の一番初めにできたら最もスマート)
paths の const は外したくないです。
…不可能でしょうか??
うまくいかない例1
C++
1template<class Derived> 2class Base { 3private: 4 static const std::vector<const char*> paths = [](){ 5 std::vector<const char*> paths; 6 7 // Derived::path がディレクトリ、path がその中のファイルとする。疑似コード。 8 for (path : Derived::path) { 9 paths.push_back(path); 10 } 11 12 return paths; 13 }(); // このラムダはコンパイル時定数を返すわけではないので、エラー 14} 15 16class Derived : public Base<Derived> { 17private: 18 static constexpr const char *path = "どこかのディレクトリへのパス"; 19}
うまくいかない例2
C++
1template<const char* path> 2class Base { 3private: 4 static const std::vector<const char*> paths = [](){ 5 std::vector<const char*> paths; 6 7 for (filename : Derived::path) { 8 paths.push_back(filename); 9 } 10 11 return paths; 12 }(); 13}; 14 15// Derived は path を使わないので、これで出来ればこれでも良いが… 16class Derived : public Base<"どこかのディレクトリへのパス"> { 17};
うまくいくけど、Derived のインスタンスを生成するたびに、ディレクトリを捜索してしまう例
C++
1template<class Derived> 2class Base { 3private: 4 const std::vector<const char*> paths = [](){ 5 std::vector<const char*> paths; 6 7 // Derived::path がディレクトリ、path がその中のファイルとする。疑似コード。 8 for (path : Derived::path) { 9 paths.push_back(path); 10 } 11 12 return paths; 13 }(); // このラムダはコンパイル時定数を返すわけではないので、エラー 14} 15 16class Derived : public Base<Derived> { 17private: 18 static constexpr const char *path = "どこかのディレクトリへのパス1"; 19}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/28 15:57
2020/06/28 16:23
2020/06/28 16:49
2020/06/29 01:12