我可以访问变量的类型以进行泛型编程吗?
Can I access a variable's type for 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
,它也可以工作。这可能吗?
我意识到我可以将它放在一个额外的函数中并使用字符串类型对其进行模板化,但是还有其他方法吗?
我认为 decltype 是您要找的。
由于 decltype 仅在 C++11 中可用,如果您必须在 11 之前编写代码,那么将您的代码设为模板可能会有所帮助
template <typename STRING_TYPE>
bool allCharsEqual(STRING_TYPE s){
/* ... */
}
您可以在 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
如果我有这样的代码:
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
,它也可以工作。这可能吗?
我意识到我可以将它放在一个额外的函数中并使用字符串类型对其进行模板化,但是还有其他方法吗?
我认为 decltype 是您要找的。
由于 decltype 仅在 C++11 中可用,如果您必须在 11 之前编写代码,那么将您的代码设为模板可能会有所帮助
template <typename STRING_TYPE>
bool allCharsEqual(STRING_TYPE s){
/* ... */
}
您可以在 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