繁体   English   中英

如何根据std :: is_same检查返回不同的类型

[英]How to return different types based on std::is_same check

请考虑以下代码:

template<typename T>
T foo() {
    if (std::is_same<T, int>::value)
        return 5;

    if (std::is_same<T, std::string>::value)
        return std::string("bar");

    throw std::exception();
}

当用foo<int>()调用时,它会抛出错误cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'int' in return

我知道解决方案是使用模板特化,但我问是否有可能通过std::is_same保持当前机制检查类型?

if两个分支必须在编译时有效,即使其中一个分支从未执行过。

如果您有权访问C ++ 17,请将if s更改为if constexpr

template<typename T>
T foo() {
    if constexpr (std::is_same<T, int>::value)
        return 5;

    if constexpr (std::is_same<T, std::string>::value)
        return std::string("bar");

    throw std::exception();
}

在C ++ 17之前,您必须使用模板特化来模拟它:

template<typename T>
T foo()
{
    throw std::exception();
}

template <>
int foo<int>() {
    return 5;
}

template <>
std::string foo<std::string>() {
    return "bar";
}

如果你真正的foo比这个例子更多的工作并且专门化它会导致代码重复,你可以引入一个辅助函数,它只封装return / throw语句,并专门化它。

在pre-C ++ 17编译器中,您可以使用标签分派来获得所需的内容。

template <typename T> tag_t {};

int foo(tag_t<int> t) { return 5; }

std::string foo(tag_t<std::string> t) { return "bar"; }

template<typename T>
T foo() {
    return foo(tag_t<T>());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM