c++ - 使用没有定义的函数c++合法吗?

标签 c++ function function-declaration

我已经看到此页面的一些代码片段 https://en.cppreference.com/w/cpp/types/result_of并注意到这个特定的函数模板签名类型:

template<class F, class... Args>
static auto call(F&& f, Args&&... args)
-> decltype(std::forward<F>(f)(std::forward<Args>(args)...));

注意:从给定的实现来看,根本没有定义,仅指定其返回类型。

如果这是可能的,有哪些可能的应用程序可以用于此目的?

最佳答案

是的,这是允许的。 decltype 是一个未计算的上下文,因此该函数实际上并未被调用,仅确定了它的返回类型。拿std::declval例如。它是标准声明的函数模板,仅允许在未计算的表达式中使用,因为它可能没有定义。

我喜欢将这些类型的函数称为元函数。您可以像类型特征一样使用它们,或者作为帮助者来构建模板代码的类型。前几天我在一个答案中使用了一个,它用于帮助将一种类型的元组转换为另一种类型。看起来像

template <template <typename> typename Transformer, typename... Ts> 
auto transform_types(std::tuple<Ts...>) -> std::tuple<typename Transformer<Ts>::type...>;

我用它来构建一个类似的类型

template <template <typename> typename Transformer, typename Tuple>
using transform_types_t = decltype(transform_types<Transformer>(std::declval<Tuple>()));

如果您想查看完整示例,请点击该帖子的链接:Transform the std::tuple types to another ones

关于c++ - 使用没有定义的函数c++合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68668285/

相关文章:

c++ - std::vector.clear() 是否在每个元素上删除(可用内存)?

c++ - 带 getline 的 while 循环不会因用户输入而结束

c++ - 类数据的重载+运算符

c++ - 如何以编程方式在 QMainWindow 中添加 QGraphicsView?

python - 类中的所有函数是否有 __enter__ 和 __exit__ 等价物?

c - 如果我不关心返回值,我应该用什么返回类型声明一个函数?

c - 签名错误的函数定义中的函数声明?

javascript - 带三元运算符的函数声明

c - if 语句中使用的 C 函数中对数组类型表达式进行赋值错误

c++ - 使用先前的函数参数声明新的函数参数是否合法?