如果我有以下代码:
std::wstring s(L"...");
bool allCharsEqual =
std::find_if(s.begin(),
s.end(),
std::bind1st(std::not_equal_to<std::wstring::value_type>(),
mystring[0])) // ^^^^^^^^^^^^^^^^^^^^^^^^
== s.end();
我希望在标记的位置有一个通用表达式,如果我将变量类型更改为std::string
,它也会起作用。这可能吗?
我意识到我可以把它放在一个额外的函数中,并用字符串类型对它进行模板化,但还有另一种方法吗?
答案 0 :(得分:4)
您可以在C ++ 11中使用decltype
:
std::not_equal_to<decltype(s)::value_type>()
或者在C ++ 14中,您可以使用transparent comparators并完全跳过模板参数:
std::not_equal_to<>()
如果您坚持使用C ++ 03,则可以创建typedef
,这样您只需要更新一个地方即可更改类型。如果你不能使用auto
并且你想要改变的类型,那么这是一般的好习惯。
typedef std::wstring str_t
答案 1 :(得分:2)
我认为decltype正是您所寻找的。 p>
由于decltype仅在C ++ 11中可用,因此如果您必须在11之前编码,那么将代码作为模板会有所帮助
template <typename STRING_TYPE>
bool allCharsEqual(STRING_TYPE s){
/* ... */
}