请考虑以下代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
调用时foo<int>(),会抛出错误cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘int’ in return.
我知道解决方案是使用模板专业化,但我问是否有可能通过检查类型来保持当前机制std::is_same?
Rei*_*ica 13
an的两个分支if必须在编译时有效,即使其中一个分支从未执行过.
如果您有权访问C++ 17,请将ifs 更改为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();
}
Run Code Online (Sandbox Code Playgroud)
在C++ 17之前,您必须使用模板特化来模拟它:
template<typename T>
T foo()
{
throw std::exception();
}
template <>
int foo<int>() {
return 5;
}
template <>
std::string foo<std::string>() {
return "bar";
}
Run Code Online (Sandbox Code Playgroud)
如果你的真实foo工作比这个例子更多,并且专门化它会导致代码重复,你可以引入一个辅助函数,它只封装return/ throwstatements,并专门化它.
在 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>());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |