我正在写一个类,其中包含不同类型的变量(假设std::string
和keyword_map
),并且应该具有一个value()
函数,该函数返回字符串或通过模板初始化retval = object.value<std::string>()
调用keyword_map值之后。到目前为止,该功能看起来像这样:
template <class T>
T value()
{
if (std::is_same<T, std::string>::value) {
return str_;
}
else if (std::is_same<T, keyword_map>::value) {
return obj_;
}
else {
return 0;
}
}
编译它会引发以下错误:
error C2440: 'return': cannot convert from 'example_class::keyword_map' to 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' (compiling source file ..\..\example_files\example_class.cpp)
是否可能需要通过static_cast
或类似的方式将返回值转换为模板返回类型?
答案 0 :(得分:1)
您可以使用constexpr if(自C ++ 17起)。
如果该值为true,则丢弃statement-false(如果存在),否则,丢弃statement-true。
例如
template <class T>
T value()
{
if constexpr (std::is_same<T, std::string>::value) {
return str_;
}
else if constexpr (std::is_same<T, keyword_map>::value) {
return obj_;
}
else {
return 0;
}
}
在C ++ 17之前,您可以应用模板专业化。
template <class T>
T value()
{
return 0;
}
template <>
std::string value<std::string>()
{
return str_;
}
template <>
keyword_map value<keyword_map>()
{
return obj_;
}