我有下面的代碼。我必須爲MyVariant
(bool,int,string,const char *)中的所有類型定義operator()
。但是,由於StartsWith
僅適用於字符串類型,所有其他函子都應該返回false。是否可以使用模板來識別兩種不同的類型?
#include "boost/variant/variant.hpp"
#include "boost/variant/apply_visitor.hpp"
using namespace std;
using namespace boost;
typedef variant<bool, int, string, const char*> MyVariant;
class StartsWith
: public boost::static_visitor<bool>
{
public:
string mPrefix;
bool operator()(string &other) const
{
return other.compare(0, mPrefix.length(), mPrefix);
}
bool operator()(int &other) const
{
return false;
}
bool operator()(bool &other) const
{
return false;
}
bool operator()(const char* other) const
{
return false;
}
StartsWith(string const& prefix):mPrefix(prefix){}
};
int main(int argc, char **argv)
{
MyVariant s1 = "hello world!";
if(apply_visitor(StartsWith("hel"), s1))
{
cout << "starts with" << endl;
}
return 0;
}
上面的代碼工作正常。但爲了使它更加簡潔,我認爲可以使用模板來爲字符串創建一個函數,併爲其他類型創建一個。我嘗試了以下,但結果是第二個函子總是被調用的。
template<typename T>
class StartsWith
: public boost::static_visitor<bool>
{
public:
T mPrefix;
bool operator()(T &other) const
{
return other.compare(0, mPrefix.length(), mPrefix);
}
template<typename U>
bool operator()(U &other)const
{
return false;
}
StartsWith(T const& prefix):mPrefix(prefix){}
};
下面的代碼沒有工作,要麼:
class StartsWith
: public boost::static_visitor<bool>
{
public:
string mPrefix;
bool operator()(string &other) const
{
return other.compare(0, mPrefix.length(), mPrefix);
}
template<typename U>
bool operator()(U &other)const
{
return false;
}
StartsWith(string const& prefix):mPrefix(prefix){}
};
反正我能避免對字符串以外類型的多個「返回false」語句?
「hel」類型是「const char *」,而不是「string」。 – Gorpik
'template bool operator()(U&other)const'適合我。這可能是因爲你正在使用'const char *'。 –
Pubby