如何使用带有默认参数的模板类作为参数?

时间:2017-05-19 15:47:10

标签: c++ templates

我正在尝试使用一些参数为模板类准备一些专用函数。如何告诉settings print_settings接受testl以及testllb?我如何宣布long * / bool实例以及为什么编译器不能为其他类型(当时给出的)推断出正确的类型?

#include <iostream>
#include <type_traits>

template <typename T, T const *a=nullptr, bool const b=false>
class settings {
public:
    friend std::ostream operator<<(std::ostream &os, const settings &set) {
        os << set.min_val();
    }
    T const min_val() const {return a ? *a : -1;};
};

long l0{0};

void print_settings(settings<long> t) {
    std::cout << "INTEGER: " << t.min_val() << std::endl;
}

int main(int argc, char *argv[]) {
    settings<long> testl;
    print_settings(testl);
    settings<long, &l0, true> testllb;
    // print_settings(testllb); // This is failing.
    return 0;
}

1 个答案:

答案 0 :(得分:0)

settings<long>settings<long, &l0, true>是不同的类。

因此,我们每个班级都需要重载。

实现这一目标的最简单方法是使用模板功能:

template <long const *a, const bool b>
void print_settings(settings<long, a, b> t) {
    std::cout << "INTEGER: " << t.min_val() << std::endl;
}