Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在生成时指定模板参数_C++_Templates - Fatal编程技术网

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";
     }
} ;