如何定义在用作函数参数时工作的类模板的转换
How to define conversion to class template working when used as function argument
拥有此模板:
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(魔法可以帮助解决这个问题,我想我也可以总结为: 如何定义函数的演绎指南?
template <bool X = false> void f(Foo<X> foo)
的问题在于,将参数传递给模板参数推导中使用的参数时,不允许隐式转换。
您可以在接受int
时添加额外的重载f
,或者根本不f
模板:
struct Bar
{
bool x = false;
int v = 0;
template <bool X>
Bar(Foo<X> foo) : x(X), v(foo) {}
Bar(int v) : v(v) {}
};
void f(Bar bar) {...}
这意味着布尔值不再constexpr
在f
内部。如果你想让它constexpr
,你可以使用一个技巧:
void f(Bar bar)
{
auto lambda = [&](auto x_value)
{
constexpr bool x = x_value;
// Here `x` is `constexpr`.
};
if (bar.x)
lambda(std::true_type{});
else
lambda(std::false_type{});
}
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何定义在用作函数参数时工作的类模板的转换
- C++20字符串文本模板参数工作示例
- C++中的可变参数模板及其工作原理
- std::bind,无法让具有单个参数的方法工作
- 隐式转换是否应该在模板参数的上下文中工作?
- 我不明白参数和参数如何协同工作
- 通过参数启用时,std::enabled_if 如何工作
- 当传递NULL作为参数时,函数重载是如何工作的
- GoogleTest 中的参数化测试无法按预期工作
- 此函数如何在不传递任何参数的情况下工作?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 参数传递和返回值如何在程序集级别的 x86 上的 C/C++ 中工作?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- 工作函数重载如何使用可变参数解析?
- 宏参数的扩展如何在 c++ 中工作
- 错误太多参数无法正常工作
- 具有可变参数的std ::函数列表如何工作
- C++参数化构造函数使代码在传递大输入时停止工作