【发布时间】:2014-12-23 22:35:25
【问题描述】:
这是对这个(更一般的)问题的跟进:previous question。此处给出了当前问题的部分答案:partial answer to the present question。
我对基于模板参数的返回类型的显式特化感兴趣。虽然上面给出的答案提供了问题的解决方案,但我相信有一种更优雅的方法可以使用 C++11/14 技术解决问题:
template<int N> auto getOutputPort2();
template<> auto getOutputPort2<0>();
template<> auto getOutputPort2<1>();
template<>
auto getOutputPort2<0>()
{
return std::unique_ptr<int>(new int(10));
}
template<>
auto getOutputPort2<1>()
{
return std::unique_ptr<string>(new string("asdf"));
}
上面的代码使用 gcc 4.8.3(带有 -std=c++0x 标志)按预期编译和工作。但是,它会发出以下警告:
getOutputPort2函数使用auto类型说明符,没有尾随返回类型。
据我了解,这将成为 C++14 标准的一部分。但是,有没有办法在 C++11 中实现上述功能? decltype可以用在这里吗?
编辑。在下面的 cmets 之后,我还想问一个额外的问题。从 C++14 标准的角度来看,上面的代码是否有效?如果没有,为什么不呢?
【问题讨论】:
-
"上面的代码使用 gcc 4.8.3 编译并按预期工作" - 在 g++ 4.9.0 -std=c++11 中无法编译;
template<int N> auto getOutputPort2();这行说它不能推断返回类型 -
@MattMcNabb 感谢您指出这一点。你试过-c++1y吗?对我来说,在这种情况下,它甚至不会发出警告......但是,我肯定希望确保代码至少可以与 gcc 4.8.3+ 一起使用。您还使用什么其他编译器选项?从 C++14 标准的角度来看,这段代码是否正确?我很遗憾没有在我的问题中包含此评论的最后一个问题...
-
不知道很抱歉 - 也许发布一个新问题来询问它是否是有效的 C++14 !我使用 gcc.godbolt.org 上的在线编译器进行检查。
标签: c++ templates c++11 overloading explicit-specialization