是否可以在编译时收集数据

时间:2013-03-19 16:57:18

标签: c++ templates c-preprocessor metaprogramming

目标:在代码的不同部分,我正在加载文件(在我的情况下是纹理和字体)。 因此,下载文件可以在程序执行的任何时候发生(虽然所有缓存,但仍然。)我想下载只在启动时发生一次。

可能的解决方案:

  1. 使用纹理和字体手动填写缓存对象。
  2. 扫描文件夹/ textures / / fonts /
  3. 魔术
  4. 实际上我会像第二种情况那样为纹理做(因为它对内存并不重要)。对于字体,我将使用第一种情况(因为它们将针对每种尺寸使用不同的渲染)。但我仍然想知道如何自动化这个过程。

    应该忘记纹理和字体以缩小问题范围并考虑带字符串的矢量。

    class Files{
        static vector<string> files;
        static void addFile(string file){/* magic. may be template<string file> */}
        static void loadFiles()
        {
             for(auto file:files){
                cout << file; //for example
             }
        }
    
    }
    
    int main(){
        Files::loadFiles();//=> foobarsmthing
        Files::addFile("foo");
        Files::addFile("bar");
        Files::addFile("smthing");
        return 0;
    }
    

    我知道用模板计算一些表达式是可能的。并认为我的问题的答案只是“不”。

1 个答案:

答案 0 :(得分:3)

当然,这是可能的。只是不作为C ++模板元编程的一部分。 TMP是图灵完备的,这意味着当涉及到它可以计算的内容时,它就像任何其他编程语言一样强大。但它无法与外界交谈。它无法通过网络套接字进行通信,无法扫描硬盘驱动器中的文件,无法播放声音,也无法在桌面上呈现茶壶。

但是您可以在编译过程中运行其他脚本。 MSBuild和所有类型的makefile都支持在编译期间运行任意脚本。您不必限制自己仅运行 C ++编译器。