根据C ++中的模板类型返回不同类型的对象

时间:2019-02-25 09:53:03

标签: c++ templates

我正在写一个类,其中包含不同类型的变量(假设std::stringkeyword_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或类似的方式将返回值转换为模板返回类型?

1 个答案:

答案 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_;
}