c++ - 覆盖常量表达式?

标签 c++ templates c++11 overloading constexpr

是否可以根据某物是否为常量表达式来覆盖函数和/或模板?

基本上我想做的是构建一个字符串类,如果传递一个静态字符串或指向一个的 constexpr 变量,它只会使用该指针,以后不会尝试删除它。

另一方面,如果给类一个缓冲区,它需要复制它或采用它,然后在析构函数中删除它。

我认为最接近的可能是使用强类型定义并要求程序员在该类型定义下声明他/她的静态字符串。我想知道那些比我聪明的人是否可以想出一些不需要它的东西。

最佳答案

Basically what I'd like to do is build a string class that if handed a static string, or a constexpr variable pointing at one, it will simply use that pointer and won't later try to delete it.

我认为我们正面临一个 XY-problem这里。知道一个表达式是否是 constexpr 并不会告诉您它是否适合 delete

我会说如果这个操作有可能不合适,函数不应该尝试猜测是否删除。我相信调用者应该处理这个问题,可能使用智能指针来处理这个问题。

换句话说,我会让函数接受左值引用,如果指向的对象必须作为参数传递给函数,则让客户端取消引用指针。

我会说这种模式不仅在 delete 的情况下有意义:更一般地说,如果一段代码有责任决定一些值应该如何生成或计算(例如对象分配),然后正确执行某些相关或相应操作(例如清理)的责任应该属于同一段代码:

void foo(my_object& o)
{
    // ...
}

my_object o;
foo(o);
// The argument has automatic storage, no need to delete

my_object* pO = new my_object();
foo(*pO);

// The argument was allocated through operator new, we must
// deallocate it through a corresponding call to delete
delete pO;

如果您真的希望清理发生在函数中,您应该为客户端提供一种方法来告诉函数如何执行它:

void foo(my_object& o, bool shouldDelete)
{
    // ...
    if (shouldDelete) { delete &o; }
}

my_object o;
foo(o, false); // "And don't try to deallocate this object please..."

my_object* pO = new my_object();
foo(*pO, true); // "Please, delete it for me" (we are delegating the
                // responsibility of performing the material action,
                // but not the one of knowing how!)

为了获得更大的灵 active ,您甚至可以接受一个可调用对象,这让我在上面的评论中的意思更加清晰,“委派执行实质性操作的责任,而不是知道如何操作的人":

#include <functional>

void foo(my_object& o, std::function<void()> f = [] () { })
{
    // ...
    f();
}

int main()
{
    my_object o;
    foo(o); // "And don't do anything with this object when you're done..."

    my_object* pO = new my_object();
    foo(*pO, [=] () { delete pO; }); // "Please, do exactly this when done..."
}

如果您不需要在运行时确定可调用对象的类型,您甚至可以考虑将 foo() 变成函数模板


最后,关于您关于如何确定一个表达式是否为常量表达式的原始问题,这通常是不可能的,但有一些技术可以在某些情况下帮助您 - 只是意识到他们的局限性。在这方面,您可能会发现 this Q&A on StackOverflow相关。

关于c++ - 覆盖常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416883/

相关文章:

c++ - 为什么必须复制 std::initializer_list 的元素?

c++ - SFINAE 意想不到的结果

c++ - 生成的 Protobuf 代码使应用程序崩溃

c++ - 如何将字符串传递给指向对象类数组的指针?

c++ - 将部分专用模板作为模板参数传递

c++ - 推导 lambda 函数中的模板参数及其结果

c++ - 是否可以重新路由 lambda 以将其包装在包装类中?

C++ 正则表达式库

c++ - "Capture"lambda 函数中的变量解析为参数

templates - 使用 D 特征获取其实例的模板参数值