gpt4 book ai didi

c++ - 防止用户创建类的未命名实例

转载 作者:IT老高 更新时间:2023-10-28 22:14:58 25 4
gpt4 key购买 nike

对于许多 RAII "guard" 类,将其实例化为匿名变量根本没有意义:

{
std::lock_guard<std::mutex>{some_mutex};
// Does not protect the scope!
// The unnamed instance is immediately destroyed.
}

{
scope_guard{[]{ cleanup(); }};
// `cleanup()` is executed immediately!
// The unnamed instance is immediately destroyed.
}

来自 this article :

Anonymous variables in C++ have “expression scope”, meaning they are destroyed at the end of the expression in which they are created.


有什么方法可以防止用户在没有名字的情况下实例化它们吗? (“防止”可能太强了——“让它变得非常困难”也可以接受)。 em>

我可以想到两种可能的解决方法,但它们会在使用类时引入语法开销:

  1. 将类隐藏在 detail 命名空间中并提供宏。

    namespace detail
    {
    class my_guard { /* ... */ };
    };

    #define SOME_LIB_MY_GUARD(...) \
    detail::my_guard MY_GUARD_UNIQUE_NAME(__LINE__) {__VA_ARGS__}

    这可行,但 hackish

  2. 只允许用户通过高阶函数使用守卫。

    template <typename TArgTuple, typename TF>
    decltype(auto) with_guard(TArgTuple&& guardCtorArgs, TF&& f)
    {
    make_from_tuple<detail::my_guard>(std::forward<TArgTuple>(guardCtorArgs));
    f();
    }

    用法:

    with_guard(std::forward_as_tuple(some_mutex), [&]
    {
    // ...
    });

    当保护类的初始化具有“流利”语法时,此解决方法不起作用:

    {
    auto _ = guard_creator()
    .some_setting(1)
    .some_setting(2)
    .create();
    }

还有更好的选择吗?我可以使用 C++17 功能。

最佳答案

我想到的唯一明智的方法是让用户将 guard_creator::create 的结果传递给一些将左值引用作为参数的 guard_activator

这样,类的用户没有办法,只能使用名称创建对象(大多数开发人员都会做的明智的选择),或者 new 然后取消引用(疯狂的选项)

例如,您在评论中说您在非分配异步链创建器上工作。我可以考虑这样的 API:

auto token = monad_creator().then([]{...}).then([]{...}).then([]{...}).create();
launch_async_monad(token); //gets token as Token&, the user has no way BUT create this object with a name

关于c++ - 防止用户创建类的未命名实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com