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

标签 c++ templates option-type

我想做这样的事情:

我想要一个类似于 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/

相关文章:

C++如何使用相同的函数两次使用不同的名称和变量的不同名称

c++ - 非静态引用成员 ‘int& Property<int>::value’ ,不能使用默认赋值运算符

c++ - 在 C++ 中,如何访问继承类中的私有(private)基成员变量?

c++ - 禁止编译器警告声明的函数从未被引用

html - 如何使用 GO (golang) 在 HTML 中嵌入 SQLX 结果

java - Guava:如何将 Collection<T> 转换为 Collection<Optional<T>>?

scala - 无法证明 Null < :< T

java - 使用 Optional 验证输入

c++ - Qt/Qml : Custom widget -- cannot set "width" property as it is readonly

c++ - 将 emplace_back 添加到模板类