gpt4 book ai didi

c++ - 在构建时指定模板参数

转载 作者:太空狗 更新时间:2023-10-29 20:51:34 26 4
gpt4 key购买 nike

我已经使用模板来实现路径策略。

#include <fstream>
#include <DefaultPolicy.h>

template<typename PathPolicy = DefaultPolicy>
class FileReader
{
public:
double getNextNumber();

private:
PathPolicy pp;
readNumbers() { std::ifstream myFile(pp.path); }; //And so on
};

我实现了:

[HEADER]
struct DefaultPolicy
{
public:
std::string path
DefaultPolicy()
} ;

[IMPLEMENTATION]
DefaultPolicy::DefaultPolicy() : path("."){}

所以现在我想实现许多不同的政策,例如:

[HEADER]
struct UnitTestPolicy
{
public:
std::string path
UnitTestPolicy()
} ;

[IMPLEMENTATION]
UnitTestPolicy::UnitTestPolicy() : path("unittests/resources"){}

[HEADER]
struct OperationalPathPolicy
{
public:
std::string path
OperationalPathPolicy()
} ;

[IMPLEMENTATION]
OperationalPathPolicy::OperationalPathPolicy() : path("/sw/cm/resources"){}

我不确定如何更改我的政策。这些是编译时选择,我可以选择我正在构建的目标,但我唯一的想法是回退到宏来进行选择。如果我这样做,那么我真的不需要策略的模板抽象。

我应该如何在构建时选择策略类?

最佳答案

but the only idea I have is fall back to macros to make a selection

是的。


If I do that, then I don't really need the template abstraction for the policy.

错了。模板抽象可帮助您最大限度地减少预处理器的使用并彻底隔离您的策略。

您还可以在 .cpp 文件中强制实例化您的模板类,以避免由模板引起的编译时开销,因为您知道所有可能的策略类型。


// filereaderimpl.hpp

namespace detail
{
template<typename PathPolicy>
class FileReaderImpl { /* ... */ };
}

// filereader.hpp
#include <fileheaderimpl.hpp>

#ifdef SOME_BUILD_TIME_CHOICE
using FileReader = detail::FileHeaderImpl<SomePolicy>;
#else
using FileReader = detail::FileHeaderImpl<SomeOtherPolicy>;
#endif

关于c++ - 在构建时指定模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49411236/

26 4 0
文章推荐: jquery - Selenium wait.until 检查 ajax 请求完成是抛出错误
文章推荐: c# - 将 IList 转换为 IList 在运行时失败