我想做这样的事情:
我想要一个类似于boost“optional”的模板类,即它应该包含一个类型,以及该值是否有效。
假设我们有一个带有方法的A类
A::X(int value) -> int
A::Y(int value) -> int
让我们调用我的模板MyOptional
我还想做的是,如果值无效,则“中断”函数调用。我想所有函数调用的返回类型应该是 MyOptional< T>,例如,做:
MyOptional<A> a;
a->X(3);
应该给我一个没有有效值的可选项。
这意味着我需要两个不包含在boosts中的功能可选模板:
这在C ++中是否可行?我一直在看 - &gt;重载,但这似乎决定了函数调用完成的对象,不允许我自己更改返回值。
答案 0 :(得分:0)
使用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::
前缀的方法。但是有一种方法可以使用variadic宏:
#define CALL(optional, method, ...) \
Call(optional, &decltype(optional)::value_type::method, ##__VA_ARGS__)
此处假设MyOptional
模板为其参数类型定义value_type
- typedef
。
使用示例:
MyOptional<int> result = CALL(ma, X, 3);