模板函数采用一个或两个参数

时间:2015-07-28 20:51:18

标签: c++ templates

有没有办法用两种模板化类型编写函数;

  • 采取两个论点,例如
  • 如果仅使用一个参数调用函数,则将第二个参数设置为默认值?

以下不起作用:

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

4 个答案:

答案 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将是intb将是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);

}