C++ 在生成时指定模板参数
我使用模板来实现路径策略C++ 在生成时指定模板参数,c++,templates,C++,Templates,我使用模板来实现路径策略 #include <fstream> #include <DefaultPolicy.h> template<typename PathPolicy = DefaultPolicy> class FileReader { public: double getNextNumber(); private: PathPolicy pp; readNumbers() { std::ifstream
#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 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"){}
我不知道如何改变我的政策。这些都是编译时的选择,我可以选择我构建的目标,但我唯一的想法是回到宏来进行选择。如果我这样做,那么我就不需要策略的模板抽象
我应该如何在构建时选择策略类
但我唯一的想法就是回到宏来做选择
对
如果我这样做,那么我就不需要策略的模板抽象
错。模板抽象帮助您最大限度地减少预处理器的使用,并干净地隔离策略
您还可以强制在.cpp文件中实例化模板类,以避免模板造成的编译时开销,因为您知道所有可能的策略类型
编辑:我误解了这个问题,下面的解决方案将允许在运行时选择策略,您要求在构建时进行选择
我认为继承遗产能更好地解决你的问题
因此,您有一个基本PathPolicy,您可以将其命名为任何名称,即DefaultPolicy类,然后让其他策略继承自PathPolicy类
所以你的UnitTestPolicy变成了
然后在文件读取器中,仅使用基类来抽象策略类的其他实现。这样,您的文件阅读器就不在乎策略是什么;它只是去读取文件
工作示例 这在很大程度上取决于决定应该使用哪种路径策略的标准。如果您希望构建代码的用户能够传递类似-DUSE_OPERATIONAL_PATH_POLICY之类的消息,那么宏可以正常工作。如果您想根据平台功能或其他内容进行选择,您可以使用模板元编程或。这是一个有遗留触角的项目,到处都是遗留开发环境。一些开发人员非常关注特定环境的舒适性,不管它与即将成为QA环境的环境有多大的不同。我们正在尝试进行CI构建,我需要让Jenkins能够在不让其他开发人员哭泣的情况下进行设置。我一直在努力了解“使用”是否不仅仅是一种方便。这显然是语义有用的赢家。
[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"){}
// 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
struct UnitTestPolicy : public PathPolicy
{
public:
UnitTestPolicy()
{
path = "blah//blah";
}
} ;