如何在可变参数模板中检查非原始类型?

时间:2018-03-04 19:08:06

标签: c++ c++11 templates variadic-templates stdvector

我正在尝试编写一个名为p的实用程序函数,其中如果传递了一个基本类型,它只打印它,如果传递了p基本类型,它必须循​​环它然后打印出来。我尝试了print() std::vector<int>,但失败了,主要是因为我不确定c ++中是否允许这样做。如果你能为所有原始类型的向量提供一些通用的方法,那将会非常有用。

std::vector

这是我遇到的错误,如果有帮助:

int

由于

1 个答案:

答案 0 :(得分:4)

如果您可以编译C ++ 17,则可以使用if constexpr

if constexpr (std::is_same<T, std::vector<int>>::value)

在C ++ 17之前,您必须开发不同的函数,因为type.begin() / type.end()部分也是在value为假时编译的(同时T不是一个std::vector)。

“拆分”功能的一种可能方法如下

template <typename... Args>
void print (std::ostream& out, std::vector<int> const & v, Args... args) 
 {
   for (auto const & i : v)
     out << i << ' ';

   print(out, args...);
 }

template <typename T, typename... Args>
void print (std::ostream& out, T type, Args... args) 
 {
   out << type;

   print(out, args...);
 }

或者,如果您想拦截不同的std::vector类型,您可以模板化T的{​​{1}}类型,第一个函数变为

std::vector