如何在 C++ 模板中有多个类型名参数?
#ifndef _CALL_TEMP_H
#define _CALL_TEMP_H
#include <string>
#include <iostream>
template <typename Sig>
class Foo;
template <typename A, typename B>
class Foo
{
public:
void output() {
std::cout << a_ << b_ << std::endl;
}
A a_;
B b_;
};
template <typename A, typename B, typename C>
class Foo
{
public:
void output() {
std::cout << a_ << b_ << c_ << std::endl;
}
A a_;
B b_;
C c_;
};
#endif
用法:
int main()
{
Foo<int ,int> doubleint;
doubleint.a_ = 1;
doubleint.b_ = 2;
doubleint.output();
// Foo<int , int , std::string> comp;
// comp.a_ = 1;
// comp.b_ = 2;
// comp.c_ = "haha";
// comp.output();
return 0;
}
但它不会编译。我怎样才能让它编译?
原文由 Jichao 发布,翻译遵循 CC BY-SA 4.0 许可协议
只需使用可变参数模板声明一个主模板,然后专门针对每个支持的模板参数数量。例如:
我不能使用 C++11,并且想要保留类似的符号,您需要使用模板默认参数来模拟可变参数列表。这将隐式限制模板参数的数量,但由于无论如何您都在专门化模板,所以这个限制并不重要。
如果可以接受使用不同的符号,您还可以使用看起来像函数声明的东西来实例化和专门化您的模板:
符号的更改是否可以接受取决于您对类模板的使用。但是,如果没有 C++11,您将无法获得理想的解决方案。
顺便说一句, 不要过度使用
std::endl
:使用'\n'
表示行尾。如果您真的要刷新流,请使用std::flush
。此外,_CALL_TEMP_H
是标准 C++ 库保留的名称,所有以下划线后跟大写字符的名称也是如此:除非有使用它们的明确许可,否则 不要 在您自己的代码中使用这些名称(例如__FILE__
和__LINE__
被保留,但已授予使用它们的明确许可)。