我正在创建自己的字符串class
,我想确保CString a = "Hello " + "World!";
有效(即不会产生编译错误,例如:cannot add 2 pointers
)。
我的字符串class
会在需要时自动转换为char*
,因此编写printf(a)
不会破坏代码。
有没有办法替换字符周围的编译器行为? (即在引号之间,"abc"
)。或者,或者,更改+
运算符的行为以处理字符串?
答案 0 :(得分:9)
你不能完全,因为你只能为类类重载运算符,而字符串文字没有类类型。
您可以利用在预处理期间发生的字符串文字的连接:
CString a = "Hello " "World!";
或者您可以创建一个CString
临时文件并附加到其中:
CString a = CString("Hello ") + "World!";
或者您可以拥有一个带有多个参数的CString
构造函数:
CString a("Hello ", "World!");
答案 1 :(得分:6)
没有。 您不能为内置函数重载运算符,例如指针。
James McNellis已经回答了这个问题,所以我不会详细说明。
(我使用std :: string,因为我的内部字符串没有信息)
使用typedef会在语法中添加一些糖:
typedef std::string S_ ;
int main(int argc, char* argv[])
{
std::string s = S_("Hello") + S_(" World") ;
std::cout << "s : " << s << std::endl ;
return 0 ;
}
但是,我不会用一个两个字符的符号来污染全局命名空间只是为了一点糖......据我所知,代码效率低下(创建了两个字符串对象,加上一个临时的,没有保证编译器将它全部优化...)
作为一个好奇心,通过将字符串包装成一个瘦的类,你可以“添加”这两个指针。
首先,让我们创建包装器:
class StringThinWrapper
{
public :
StringThinWrapper(const char * p) : m_p(p) {}
operator const char * () const { return m_p ; }
private :
const char * const m_p ;
} ;
正如你所看到的,它既是内联的,也不会做什么......但是,它能够将自己转换为const char *指针(这种黑客很危险,所以要确保它是你想做的)
然后,对于这个包装器,让我们重载加法运算符:
inline std::string operator + (const StringThinWrapper & lhs, const StringThinWrapper & rhs)
{
std::string s(lhs) ;
s += rhs ;
return s ;
}
现在,让我们使用包装器编写一个main
函数,typedefed易于使用:
typedef StringThinWrapper S_ ;
int main(int argc, char* argv[])
{
std::string s = S_("Hello") + S_(" World") ;
std::cout << "s : " << s << std::endl ;
return 0 ;
}
编译并给出以下结果:
s:Hello World
免责声明:我只想玩你的问题给我的想法,并与你分享。不要因为可以而应用这种代码。实际上,这个代码应该被改进以便在使用之前有效地覆盖所有情况,即使这样,简单的typedef std::string S_ ;
也会更好恕我直言。
AFAIK,我不会使用它,因为我对当前的STL API感到满意。
在C ++ 0x中,您将能够创建自己的文字。代码有点像:
std::string operator "str"(const char * p)
{
return std::string(p);
}
你将使用它:
int main(int argc, char * argv[])
{
std::string s = "Hello"str + " World"str ;
std::cout << "s : " << s << std::endl ;
return 0 ;
}
有关详细信息,请参阅以下SO问题: What new capabilities do user-defined literals add to C++?。