我想做这样的事情:
我想要一个类似于 boosts“可选”的模板类,即它应该包含一个类型,以及该值是否有效。
假设我们有一个带有方法的类 A
A::X(int value) -> int
A::Y(int value) -> int
让我调用我的模板 MyOptional
我还想做的是在值无效时“中断”函数调用。我想所有函数调用的返回类型应该是 MyOptional< T >,例如,做:
MyOptional<A> a;
a->X(3);
应该给我一个没有有效值的 Optional。
这意味着我需要两个未包含在 boosts 可选模板中的功能:
- 条件函数调用或模板定义的行为取决于状态。
- 在模板类型中嵌入返回类型。
这在 C++ 中甚至可能吗?我一直在看 -> 重载,但这似乎决定了函数调用是用什么对象完成的,不允许我更改返回值本身。
最佳答案
有一个使用 C++11 的解决方案。假设 MyOptional
模板具有与 boost::optional
模板相同的功能(例如 operator*
、operator->
, 转换为 bool
运算符等)。然后我们可以编写函数模板Call
:
template <class Class, typename Method, typename... Arguments>
auto Call2
(
MyOptional<Class>& optional,
Method Class::*method,
Arguments&&... arguments
)
-> MyOptional
<decltype((*optional.*method)(std::forward<Arguments>(arguments)...))>
{
typedef decltype((*optional.*method)(std::forward<Arguments>(arguments)...))
ResultType;
if (optional)
{
return MyOptional<ResultType>
((*optional.*method)(std::forward<Arguments>(arguments)...));
// you can add here some code for processing the value returned by method
}
else
{
return MyOptional<ResultType>();
}
}
此函数的示例使用:
MyOptional<A> a;
MyOptional<int> result = Call(a, &A::X, 3);
我找不到仅使用语言工具省略方法名称的 &A::
前缀的方法。但是有一种使用可变参数宏的方法:
#define CALL(optional, method, ...) \
Call(optional, &decltype(optional)::value_type::method, ##__VA_ARGS__)
此处假设 MyOptional
模板为其参数类型定义了 value_type
- typedef
。
使用示例:
MyOptional<int> result = CALL(ma, X, 3);
关于c++ - 在 C++ 中,使用模板根据状态更改函数调用的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244663/