有没有办法用两种模板化类型编写函数;
以下不起作用:
#include <iostream>
template <class A, class B>
void f (A a, B b = 0) {
std::cout << "Hello world!" << std::endl;
}
int main () {
int i;
f (i);
}
换句话说,我想对
进行“模板类比”template <class A>
void f (A a, int b = 0) {
std::cout << "Hello world!" << std::endl;
}
答案 0 :(得分:4)
是的,如果你准备给B
一个默认类型(并使用C ++ 11)。
template <class A, class B = int>
void f (A a, B b = B{}) {
std::cout << "Hello world!" << std::endl;
}
int main () {
int i;
f (i);
}
或者重载f
并根据需要提供默认值。
答案 1 :(得分:3)
希望这是你正在寻找的,所以如果f没有传递第二个参数,那么B
将是int
而b
将是0.虽然可以改变
#include <iostream>
template <class A, class B = int>
void f (A a, B b = 0) {
std::cout << "Hello world!" << std::endl;
}
int main () {
int i = 42;
f(i);
f(i, "something");
}
答案 2 :(得分:0)
重载f
,使其使用您想要的默认值:
#include <iostream>
template <class A, class B>
void f (A a, B b) {
std::cout << "Hello world!" << std::endl;
}
template <class A>
void f (A a) {
f(a, 0);
}
int main () {
int i;
f (i);
}
如果此实施是性能问题,您可以转发a
。
答案 3 :(得分:-2)
您可以使用B类型的默认构造函数。它也适用于原始数据类型:
include <iostream>
include <string>
using std::cout;
using std::endl;
using std::string;
class TestClass {
public:
TestClass() {
cout << "TestClass()" << endl;
}
};
std::ostream& operator<<(std::ostream &os, const TestClass &tcl) {
os << "TestClass" << endl;
return os;
}
template <class A, class B>
void f (A a, B b = B()) {
cout << "Hello world! b=" << b << endl;
}
int main(int argc, char *argv[]) {
cout << "File: " << __FILE__ << endl;
f<int, int>(1);
f<int, char>(1);
f<int, string>(1);
f<int, TestClass>(1);
}