在标准模板库(STL)中,算符是经常使用而又新推出的一个概念。一个算符即是具有函数特性的对象。既然它作为一个对象,算符包括内容,以及与算符相关联的东西。
由于能够被赋予一定数量的元素,算符和函数非常有用。开发人员在编程过程中通常需要把多个转换结果传递给一定范围的元素。其中一些转换属于函数,一些转换属于算符。然而,要把函数和算符同时保存一个数组是不可能的,因为函数和算符不能共用一个基类。
我们可以通过生成一个封装类来解决以上的问题,这一封装类既包括函数又包括算符。你可以使用任一容器来容纳它们,包括STL容器或象C中的数组。
保存在数组中的每一个函数/算符需要一个传入参数并返回一个值。这是因为函数/算符被赋予一个元素并返回一个值。
下面即是一个范例,这一范例能够将多种转换结果赋予一个字符串的数组。
#include <string>
#include <functional>
#include <deque>
#include <iostream>
// truncates a string - you pass the max. nr. of chars a string can have;
// then, for each string you pass,
// it returns a string with the nr. of chars <= max. nr. of chars
class truncate_string
: public std::unary_function< const std::string &,std::string>
{
public:
truncate_string( int nMaxChars)
: m_nMaxChars( nMaxChars) {}
std::string operator()( const std::string & strSource)
{
std::string strTruncated = strSource.substr( 0,m_nMaxChars);
return strTruncated;
}
private:
int m_nMaxChars;
};
// surrounds a string - with the two chars you pass at construction
class surround_string
: public std::unary_function< const char *, std::string>
{
public:
surround_string( char chFirst, char chLast)
: m_chFirst( chFirst), m_chLast( chLast) {}
std::string operator()( const char * strSource)
{
std::string strSurrounded;
strSurrounded += m_chFirst;
strSurrounded += strSource;
strSurrounded += m_chLast;
return strSurrounded;
}
private:
char m_chFirst;
char m_chLast;
};
std::string first_half( const char * strSource)
{
std::string strHalf = strSource;
size_t nLen = strHalf.length();
nLen = (nLen + 1) / 2;
strHalf = strHalf.substr( 0, nLen);
return strHalf;
}
std::string second_half( const char * strSource)
{
std::string strHalf = strSource;
size_t nHalfLen = strHalf.length() / 2;
strHalf = strHalf.substr( nHalfLen);
return strHalf;
}
// trims leading & trailing spaces
std::string trim( const std::string & strSource)
{
int nLen = ( int)strSource.length();
int idxFirst = 0;
int idxLast = nLen - 1;
while ( (idxFirst < nLen) && isspace( strSource[idxFirst]))
{ idxFirst++; }
while ( ( idxLast >= idxFirst) && isspace( strSource[idxLast]))
{ idxLast--; }
if ( idxLast >= idxFirst)
{
std::string strTrimmed = strSource.substr( idxFirst, idxLast + 1 -
idxFirst);
return strTrimmed;
}
else
{
// this string contains only spaces
return std::string();
}
}