首页 > 解决方案 > 如何处理模板 const 和非 const 参数?

问题描述

我有一个模板函数采用 const 类型,例如:

template <class T, class U>
    void process(const T& v1, const U& v2)
    {
      //do some things
      verify(v1);
      verify(v2);
    }

然后验证函数使用 if constexpr 检查 T 的类型,如下所示:(该函数还返回变量。为了这个问题,我将其设置为 auto)

template <class T>
    auto verify(const T& t)
    {
      if constexpr (is_same_v<T, int>)
          return t;
      if constexpr (is_same_v<T, string>)
          return t;
      if constexpr (is_same_v<T, double*>)
          return t;
      else
          static_assert(false, "Type not allowed");
    }

如果找不到类型,则会触发编译错误。这一切都很好,但问题是我想让 v2 ​​成为非常量 U& 参数。这触发了 static_assert ,我不知道为什么。我还将两个函数中的所有参数都设置为非常量,但我仍然得到同样的错误。我真正想要的只是通过引用传递参数。谁能给我一些提示?提前致谢。

标签: c++templates

解决方案


更好的方法是使用static_assert某种类型特征:

#include <string>
#include <type_traits>

template <class T, class... Y>
inline bool constexpr is_one_of =
    (std::is_same_v<std::decay_t<T>, std::decay_t<Y>> || ...);

template <class T>
void verify() {
  static_assert(is_one_of<T, int, std::string, double*>);
}

template <class T, class U>
void process(T const& v1, U const& v2) {
  verify<T>();
  verify<U>();

  // ...
}

推荐阅读