【问题标题】:C++ template function selection based on whether argument is value or reference基于参数是值还是引用的 C++ 模板函数选择
【发布时间】:2012-10-19 04:02:45
【问题描述】:

我目前有类似的东西:

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T const &t ) {
  // ...
}

也就是说,如果T 是指针类型,我不希望考虑f。这可以正常工作。但是,现在我想要两个不同版本的f,这取决于它的参数是值返回的值还是引用返回的值:

std::string const& ret_by_ref();
std::string ret_by_val();

f( ret_by_ref() ); // I want the existing function to be called here
f( ret_by_val() ); // I want a new template specialization of f() called here

如何扩充f 的现有声明并创建一个新的f 以便如上所示调用它们?

感谢 C++-11 之前的答案。

【问题讨论】:

  • 为什么要区分值传入还是引用传入?如果你重载这些函数,它们似乎会模棱两可。
  • 因为通过引用,我想缓存结果;对于按值,缓存结果是没有意义的,因为对象是临时的。你能回答这个问题吗?

标签: c++ templates sfinae


【解决方案1】:

这很容易通过右值引用完成。只需添加

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T &&t ) {
    // ...
}

【讨论】:

  • 对 11 之前的实现有什么建议吗? (不可能肯定是有效的)。
  • WhozCraig:我不认为这可以在 C++ 2003 中完成:如果可能的话,我们就不需要右值引用了。
【解决方案2】:

对于 pre-11 编译器,您可以随时参考 boost type traits lib。

boost::is_pointer

http://www.boost.org/doc/libs/1_43_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

我建议您开始阅读 here 以了解一些类型特征的“背景和教程”。

【讨论】:

  • 我知道类型特征以及它们是如何工作的。此外,问题不在于 is_pointer。我正在寻找如何使用现有的 is_xxx 或编写自己的方法来测试参数是否是临时引用,您的答案都没有提供。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多