类成员函数参数列表是否可能依赖于模板参数?

时间:2020-05-23 23:22:48

标签: c++ class c++11 templates signature

是否有一种编写模板化类的方法,以便成员函数的签名/原型取决于模板参数?例如,如果我声明一个带有foo N个模板参数的类int,那么成员函数foo::bar()的原型是否有N个相同类型的参数?我知道我只是将std::arraystd::vector作为参数传递,但是在应用程序中,我认为这是行不通的。

template <int N>
class foo {
    std::array<float, N> _data;

 public:
    foo()  {};
    ~foo() {};

    void bar(float arg0, float arg1, float arg2 /*, ... */) const;
};

1 个答案:

答案 0 :(得分:2)

在c ++ 17中,您可以按以下方式使用类似std::enable_if_t的内容

#include <array>
#include <type_traits>

template <int N>
class Foo {
    std::array<float, N> _data;

public:
    explicit Foo( const std::array<float, N> & data): _data{data}{

    }
    template<typename ...Args>
    std::enable_if_t<sizeof...(Args)== N && std::is_same_v<std::common_type_t<Args...>, float>, void> bar(Args ... args) const{

    }
};

int main(){
    std::array<float, 3> data {.1, .3, .6};
    Foo<3> f {data};
    f.bar(data[0],data[1],data[2]);
    f.bar(1.0);//won't compile
    f.bar(1, 2, 3);//won't compile


}