是否有一种编写模板化类的方法,以便成员函数的签名/原型取决于模板参数?例如,如果我声明一个带有foo
N个模板参数的类int
,那么成员函数foo::bar()
的原型是否有N个相同类型的参数?我知道我只是将std::array
或std::vector
作为参数传递,但是在应用程序中,我认为这是行不通的。
template <int N>
class foo {
std::array<float, N> _data;
public:
foo() {};
~foo() {};
void bar(float arg0, float arg1, float arg2 /*, ... */) const;
};
答案 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
}