2015-10-15 100 views
1

如果我有代码,例如:我可以访问泛型编程的变量类型吗?

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这也将工作的通用表达。这可能吗?

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

回答

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 
2

我认为decltype是你正在寻找。

由于decltype只适用于C++ 11,也许使你的代码的模板将帮助,如果你要编写前11

template <typename STRING_TYPE> 
bool allCharsEqual(STRING_TYPE s){ 
    /* ... */ 
} 
相关问题