有可能吗?我希望它能够启用参数的编译时传递。假设它只是为了方便用户,因为总是可以使用template<class T, T X>
输出实际类型,但是对于某些类型,即指向成员函数的指针,即使使用decltype
作为一个类型,它也非常繁琐。捷径。请考虑以下代码:
struct Foo{
template<class T, T X>
void bar(){
// do something with X, compile-time passed
}
};
struct Baz{
void bang(){
}
};
int main(){
Foo f;
f.bar<int,5>();
f.bar<decltype(&Baz::bang),&Baz::bang>();
}
是否有可能将其转换为以下内容?
struct Foo{
template<auto X>
void bar(){
// do something with X, compile-time passed
}
};
struct Baz{
void bang(){
}
};
int main(){
Foo f;
f.bar<5>();
f.bar<&Baz::bang>();
}
答案 0 :(得分:13)
更新后:没有。 C ++中没有这样的功能。最接近的是宏:
#define AUTO_ARG(x) decltype(x), x
f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();
听起来你想要一个发电机:
template <typename T>
struct foo
{
foo(const T&) {} // do whatever
};
template <typename T>
foo<T> make_foo(const T& x)
{
return foo<T>(x);
}
现在而不是拼写出来:
foo<int>(5);
你可以这样做:
make_foo(5);
推断出论点。
答案 1 :(得分:3)
它是在C ++ 17中添加的 现在你可以写
了template<auto n> struct B { /* ... */ };
B<5> b1; // OK: non-type template parameter type is int
B<'a'> b2; // OK: non-type template parameter type is char
请参阅{{3>},非类型模板参数部分的第4点
答案 2 :(得分:1)
这是不可能的。唯一的方法是将参数传递给函数:
struct Foo{
template<class T> void bar(T& X) {}
};
然后将函数调用为,
f.bar(5);
f.bar(&Baz::bang);