C ++如何在不进行隐式转换的情况下模拟函数?

格雷戈里·尼斯贝特

我正在尝试使用函数模板(或其他一些模板化的结构)来模拟一个函数,而无需对参数或返回表达式进行隐式转换。最有效的方法是什么?

理想情况下,我正在尝试提出一种易于隐藏在模板或宏后面,具有不错的错误消息并且不会造成运行时损失的方法。

这旨在作为元编程练习;我不会在生产代码中这样做。

下面的函数func1需要两个longs并将它们加在一起,照常执行转换。

long func1(long a, long b) {
  return a + b;
}

我想以只能是sfunc的方式进行定义a在编译时检查表达式是否确实具有指示的类型,而无需插入隐式转换。blongreturn

为了具体起见,到目前为止,我已经尝试了几种方法来实现,而现在已经到了。

防止转换的一种方法(仅适用于自变量)是使用带有已删除实现的函数模板,以及对自变量组合进行专门化处理的函数模板。

template <class L1, class L2>
long func2(L1 a, L2 b) = delete;

template<>
long func2(long a, long b) {
  return a + b;
}

也可以用来enable_if完成相同的事情。

template <class L1, class L2>
std::enable_if_t<
  std::is_same<L1, long>::value && std::is_same<L2, long>::value
, long> func3(L1 a, L2 b) {
  return a + b;
}

但是,我无法弄清楚如何合并一个关于返回类型的断言,而不会使自己付出复制或搬家的代价,或者需要做复杂的事情来剥夺CV资格和参考性。

// doesn't work, unnecessary copy
template <class L1, class L2>
std::enable_if_t<
  std::is_same<L1,long>::value && std::is_same<L2,long>::value,
long> func4(L1 a, L2 b) {
  auto out = a + b;
  static_assert(std::is_same<decltype(out), long>::value);
  return out;
}

但是,我可以将函数体移到lambda中,然后使用static_asserts列出我想要的所有条件。我有点担心这种方法会出乎意料。

template <class L1, class L2>
long func5(L1 a, L2 b) {
  static auto wrapped = [&](){
    return a + b;
  };
  static_assert(std::is_same<decltype(a), long>::value);
  static_assert(std::is_same<decltype(b), long>::value);
  static_assert(std::is_same<decltype(wrapped()), long>::value);
  return wrapped();
}
吉夫·达德森(Jive Dadson)

可能有很多方法可以做到这一点。这是一个 我认为没有理由检查所有这些情况。您想对const-volatile限定符做什么?允许还是不允许?

#include <type_traits>
#include <iostream>

template<typename Long>
Long func1(Long a, Long b) {
    static_assert(std::is_same_v<Long, long>);
    return a + b;
}
int main()
{
    long a = 1;
    const long b = 2;
    const long &c = a;
    std::cout << func1(c,b) << std::endl;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在不进行隐式/显式强制转换的情况下在C中查找字节序

如何在不进行硬编码的情况下获取C ++中类数组的长度?

如何在不进行序列化的情况下Redis缓存大型C#对象?

如何在不进行多次 cout 的情况下轻松打印行?(C++)

如何在不进行不必要的重新编译的情况下使Git commit哈希在C ++代码中可用?

C ++如何在调用函数时阻止编译器进行隐式转换?

如何在不访问 w3c 的情况下进行 fo 到 pdf 的转换?

C++ 如何在不显式转换的情况下在函数调用中降级类实例?

如何在不进行繁琐的转换的情况下跨这些列应用函数?

C ++:如何在不使用任何内置函数的情况下将字符串转换为整数

杂项函数在C中进行隐式转换?

如何在C中不进行赋值而强制转换指针?

C ++如何在没有std :: function的情况下声明函数返回函数?

C#如何在不使用值的情况下显式调用getter

c# - 如何在不使用任何系统帮助函数的情况下将字节 [] 转换为 c# 中的 int?

隐式转换如何在C ++中工作

如何在不进行日期类型转换的情况下将列表转换为数据框

如何在不损失结果范围的情况下将C中的uint转换为int

如何在不违反C ++核心准则的情况下将整数转换为void *?

如何在不使用幻数的情况下将“字符数”转换为int?(在C ++中)

C#如何在没有bool的情况下最终进行尝试捕获以释放资源?

如何在C#中没有System.Web dll的情况下进行UrlDecode

如何在不使用member.functionName语法C ++的情况下访问成员函数?

如何在不复制对象的情况下公开将C ++对象返回给Python的函数?

C++:如何在不定义的情况下声明非函数?

C ++构造函数-如何在没有新知识的情况下启动?

如何在允许空数组的情况下使用模板函数计算C ++数组项

C ++如何在不调用构造函数的情况下分配对象

c# - 如何在不使用数组或拆分函数的情况下拆分字符串#