2013-03-14 84 views
4

是否有可能根据某个东西是否为常量表达式来覆盖函数和/或模板?重写常量表达式?

基本上我想要做的是建立一个字符串类,如果在一个递给一个静态字符串或constexpr变量指向,它会简单地使用指针,以后不会尝试将其删除。另一方面,如果类传递了缓冲区,它需要复制它或采用它,然后在析构函数中将其删除。

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

+0

根据你的解释,我不明白为什么你应该把一个文件范围数组与块范围数组区别开来。前者是一个地址常量表达式,后者不是,但都不应该被删除。 – hvd 2013-03-14 18:09:49

+0

你的意思是过载而不是重载,对吧? – GManNickG 2013-03-14 18:11:40

+1

不幸的是,没有办法找到传递的参数是否最初是一个常量表达式,而不需要用户告诉你。 – Xeo 2013-03-14 18:11:54

回答

1

基本上我想要做的是建立一个字符串类,如果在一个递给一个静态字符串或constexpr变量指向,它会简单地使用指针,以后不会尝试将其删除。

我认为我们在这里面临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; 

如果你真的想清理到发生的功能,你应该给客户一个办法ELL功能如何执行它:

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!) 

要允许更大的灵活性,你甚至可以接受一个可调用的对象,这使得更清楚我在上面的评论的意思是“委托执行资料的责任动作,但不知道的一个人如何“:

#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有关。

+0

我很明白地问过我想回答的问题。不管怎么说,还是要谢谢你。 – 2013-03-14 21:28:14

+0

@CrazyEddie:如果你是低调的,我想解释一下。除了指出你的方法可能无法确定是否安全或者不能删除,我的答案也会回答你有问题的问题,因为它会告诉你如何确定一个表达式是否是一个常量表达式的相关问答。 – 2013-03-14 21:41:03