如何在模板类中正确显式实例化可变参数模板

时间:2016-04-13 09:12:09

标签: c++ templates variadic-templates

我有用于记录的模板类会将其剪切为显示问题的根源:

#ifndef LOGGER_HPP
#define LOGGER_HPP
#include "defines.hpp"

namespace Logger{

    template<typename logPolicy>
    class Logger{
        std::stringstream buffer;
        template<typename First, typename...Rest>
        void print_impl(First first, Rest...rest){
            buffer<<first;
            print_impl(rest...);
        }

        void print_impl(){
            policy->write(buffer.str());
            buffer.str("");
        }
    public:
        Logger(const std::string& fname): policy(nullptr){
        }

        template<Severity level, typename...Args>
        void print(Args...args){
            print_impl(args...);
        }

        ~Logger(){
            if(policy){
                policy->close();
                delete policy;
            }
        }
    };

}

#endif

我想将该类的定义移动到cpp文件。我只需要FileLogPolicy类型的一个对象,它将在cpp文件中显式实例化:

Logger<FileLogPolicy> logger("log.txt");

并像这样使用它: Logger::logger.print<DEBUG>("Exception happened", "bla bla bla"); 现在,在没有可变参数模板的情况下设置模板类很容易,但是使用可变参数模板编译器期望我为打印期望的每种参数类型组合提供特化。 我可以在cpp文件中使用variadic模板实例化模板类吗?如果是这样的话?

0 个答案:

没有答案