我可以访问变量的类型进行泛型编程吗?

时间:2015-10-15 14:55:06

标签: c++ templates types generic-programming

如果我有以下代码:

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,它也会起作用。这可能吗?

我意识到我可以把它放在一个额外的函数中,并用字符串类型对它进行模板化,但还有另一种方法吗?

2 个答案:

答案 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正是您所寻找的。

由于decltype仅在C ++ 11中可用,因此如果您必须在11之前编码,那么将代码作为模板会有所帮助

template <typename STRING_TYPE> 
bool allCharsEqual(STRING_TYPE s){
    /* ... */
}