【问题标题】:Overload operator const char* for retrofitting in-place?重载运算符 const char* 以进行就地改造?
【发布时间】:2015-03-02 03:43:58
【问题描述】:

我正在处理一堆现有的测试,如下所示(实际上有几百个):

bool Test_X(const char* file) {
    ...
}

它会被称为:

result = Test_X("TestData/test-set-X.bin");

问题是在make install 之后,TestData 不再在$PWD 中,所以测试程序失败并出现file not found 错误。

我想创建一个 Locate 类来尝试抽象出差异。为了使其微创,我想像这样使用它:

result = Test_X(Locate("TestData/test-set-X.bin"));

为了实现这一点,我认为需要重载operator const char*(和一些朋友)。但是,这违反了规则:

  • 自动施法几乎总是邪恶的

例如,请参阅 Stack Overflow 上的这个问题/答案:Why does std::string not provide a conversion to const char*?

问题变得有点复杂,因为在遇到make PREFIX=/usr/local && sudo make install PREFIX=/usr/local 时测试需要工作。所以我需要将make directory variables 向下传播到 C++ 代码中。

超载是我唯一的选择,因此在这种情况下是必要的邪恶吗?还是我缺少其他解决方案?

【问题讨论】:

  • Test_X(Locate("blah").c_str())?
  • 为什么Locate 应该是一个类?
  • @n.m. - 我认为有两个原因。首先,它是一个 C++ 库,并且该库的作者需要一定程度的 OOP(他不使用预处理器宏进行字符串连接)。其次,我需要根据提供给Locate的路径做一些处理。它要么是$(prefix)/share/<lib name>/TestData,要么是./。打包数据及其函数需要一个 C++ 类。
  • @jww 为什么函数对象不能满足需求?
  • “打包数据及其功能”。你这样做是不对的。您正在从一些不属于Locatestatic 数据中获取前缀。静态数据并不是真正意义上的“与类打包”。如果你正在做类似Locator loc(prefix); ....; loc.locate(path); 的事情,那就是将数据(prefix)与函数(locate)一起打包。您拥有的是一个普通的老式独立函数,出于未知原因,您将其硬塞到一个类中。

标签: c++ string class implicit-conversion


【解决方案1】:

坦率地说,我不太明白你的问题。所以我只能试着回答这个问题,希望对你有帮助。

函数对象好吗?

class Locate{
public:
    Locate(const string& pwd):pwd(pwd){}
    const char* operator()(const char* suffix){
            string result=pwd+suffix;
            return result.c_str();
    }
private:
    string pwd;  
};

使用示例:

Locate locate("yourpwd");
Test_X(locate("TestData/test-set-X.bin")); #not Locate,it is locate

【讨论】:

  • 谢谢罗恩。你对这个问题有什么不明白的地方?
  • 你有什么问题?
  • @jww 为什么 Function object 和 c_str 不能满足需求?谢谢
  • 我真的不知道函数对象在这种情况下会是什么样子。如果它是您在上面共享的代码,那么我已经有了。我想知道它是否正确,或者是否有更好的方法。此外,由于它就地,您将无法声明该类型的变量(即Locate locate(...))。它将是一群匿名的临时工。
  • @jww - OK,相信你会遇到很多挑战,我会继续关注这个问题,谢谢
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多