使用没有定义 C++ 的函数是否合法?
Is it legal to use function with no definition c++?
我从该页面看到了一些代码片段 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)...));
注意:从给定的实现来看,根本没有定义,只指定了它的return类型。
如果可以的话,有哪些可能的应用程序可以用于此?
是的,这是允许的。 decltype
是一个未评估的上下文,因此实际上并未调用该函数,只是确定了它的 return 类型。以 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>()));
这里是 link 到那个 post 如果你想看完整的例子:
我从该页面看到了一些代码片段 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)...));
注意:从给定的实现来看,根本没有定义,只指定了它的return类型。
如果可以的话,有哪些可能的应用程序可以用于此?
是的,这是允许的。 decltype
是一个未评估的上下文,因此实际上并未调用该函数,只是确定了它的 return 类型。以 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>()));
这里是 link 到那个 post 如果你想看完整的例子: