在C ++中,使用模板根据状态更改函数调用的行为

时间:2013-11-27 14:09:27

标签: c++ templates optional

我想做这样的事情:

我想要一个类似于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;重载,但这似乎决定了函数调用完成的对象,不允许我自己更改返回值。

1 个答案:

答案 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);