接口中的虚拟变量模板方法
Virtual variadic template method in interface
C++ 中不能有虚拟模板方法。我想要一个接口和一些实现它的 类 。例如:
class Logger {
public:
template<typename... Args>
virtual void Error(const std::string& message, Args... args) const = 0;
};
class ConsoleLogger : public Logger {
public:
template<typename... Args>
void Error(const std::string& message, Args... args) const{}
};
有什么变通办法吗?我还是想用界面
尽管“更喜欢组合而不是继承”往往是盲目的鹦鹉学舌,但它在这里确实派上用场了。
class LoggerImpl {
public:
virtual ~LoggerImpl() {}
virtual void dispatch(const std::string& message, std::vector<std::string> args) = 0;
};
class Logger {
std::unique_ptr<LoggerImpl> _impl;
public:
Logger(std::unique_ptr<LoggerImpl> impl) : _impl(impl) {}
template<typename... Args>
void Error(const std::string& message, Args... args) const {
std::vector<std::string> args_as_strings;
// Make strings from args
_impl->dispatch(message, std::move(args_as_strings));
}
};
您实际将 args 传递给 _impl
的方式不一定是向量。这主要是一个实现细节。只要您使用的任何机制都是“虚拟友好的”。它会很好地工作。
C++ 中不能有虚拟模板方法。我想要一个接口和一些实现它的 类 。例如:
class Logger {
public:
template<typename... Args>
virtual void Error(const std::string& message, Args... args) const = 0;
};
class ConsoleLogger : public Logger {
public:
template<typename... Args>
void Error(const std::string& message, Args... args) const{}
};
有什么变通办法吗?我还是想用界面
尽管“更喜欢组合而不是继承”往往是盲目的鹦鹉学舌,但它在这里确实派上用场了。
class LoggerImpl {
public:
virtual ~LoggerImpl() {}
virtual void dispatch(const std::string& message, std::vector<std::string> args) = 0;
};
class Logger {
std::unique_ptr<LoggerImpl> _impl;
public:
Logger(std::unique_ptr<LoggerImpl> impl) : _impl(impl) {}
template<typename... Args>
void Error(const std::string& message, Args... args) const {
std::vector<std::string> args_as_strings;
// Make strings from args
_impl->dispatch(message, std::move(args_as_strings));
}
};
您实际将 args 传递给 _impl
的方式不一定是向量。这主要是一个实现细节。只要您使用的任何机制都是“虚拟友好的”。它会很好地工作。