c++ - 如何处理模板 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 ,我不知道为什么。我还将两个函数中的所有参数都设置为非常量,但我仍然得到同样的错误。我真正想要的只是通过引用传递参数。谁能给我一些提示?提前致谢。
解决方案
更好的方法是使用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>();
// ...
}
推荐阅读
- mysql - 用自由文本 mysql json_object 包装值
- c# - Paypal Webhooks - 将帖子正文值转换为对象
- google-tag-manager - 结合多个谷歌标签管理器触发器
- php - 使用没有 foreach 的 json 解码数组
- javascript - 跨组件中的函数访问事件侦听器数据
- sql - 如何在不多次复制和粘贴同一个正文的情况下加入大量表?
- vba - 捕获 Access 2013 表单上的更改时出现保留错误
- javascript - ESLint:等号周围的间距
- javascript - 在行和列中动态添加值总和
- asp.net - ASP.NET:从一个 SQL 命令填充多个标签