【发布时间】: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 为什么函数对象不能满足需求?
-
“打包数据及其功能”。你这样做是不对的。您正在从一些不属于
Locate的static 数据中获取前缀。静态数据并不是真正意义上的“与类打包”。如果你正在做类似Locator loc(prefix); ....; loc.locate(path);的事情,那就是将数据(prefix)与函数(locate)一起打包。您拥有的是一个普通的老式独立函数,出于未知原因,您将其硬塞到一个类中。
标签: c++ string class implicit-conversion