【发布时间】:2020-05-17 20:33:55
【问题描述】:
拥有这个模板:
template <bool X>
struct Foo {
Foo(int v) : v(v) {}
int v;
};
我可以说,默认情况下Foo应该是False,带有推导指南:
Foo(int)->Foo<false>;
感谢这段代码的工作:
Foo a = 5;
我的问题是,当Foo 用作函数参数时,我怎样才能使它工作:
template <bool X>
void f(Foo<X> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
}
f(5); // error: no matching function for call to 'f'
// candidate template ignored: could not match 'Foo<X>' against 'int'
我试着以某种方式说 f X 默认为 false 但 f(我的意思是编译器)不听我的:
template <bool X = false> // = false changes nothing, same error
void f(Foo<X> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
}
template <bool X>
struct get_bool { // to force looking at f::X
static constexpr bool value = X;
};
template <bool X = false>
void f(Foo<get_bool<X>::value> foo) {
cout << "Foo<" << X << ">(" << foo.v << ")" << endl;
/* this is not working because
* get_bool evaulates before
* args matching and in the end,
* this function could be defined
* as: void f(Foo<false>)
*/
}
我不介意引入一些额外的辅助类等。
我希望也许一些 decltype、auto、some_trait<> 或其他辅助类 (/es) 魔法可以帮助解决这个问题,我想我也可以总结为:
如何定义函数的推导指南?
【问题讨论】:
标签: c++ templates c++17 compile-time