c++ 利用函数类型定义新函数

ttp71kqs  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(94)

好奇地想知道是否曾经有过扩展语言并在函数定义中利用已定义的函数类型的提议。
一个相关的问题是:Using a defined function type in a function declaration
其中,当然,其中一个注解指出定义的函数类型不能(当前)用于函数定义中。
那么,允许以下代码的未来扩展有什么缺点呢?

using F = int(void);

F f{
  return 42;
}

当然,这只是一个简单的例子,没有参数名需要处理。

p8ekf7hl

p8ekf7hl1#

其中,当然,其中一个注解指出定义的函数类型不能(当前)用于函数定义中。
我实际上没有检查你所指的评论,但正如引用的声明是不正确的。你可以使用一个函数的返回和参数类型来推断另一个函数的返回和参数类型。它只需要一些样板文件。
下面的代码在C++11中基本上可以工作:
获取返回类型的trait:

template <typename F> struct return_type;
template <typename R,typename ...Args> struct return_type<R(Args...)> {
    using type = R;
};

用于检查参数类型的trait:

template <typename F,typename...Args> struct same_args : std::false_type {};
template <typename R,typename ...Args> struct same_args<R(Args...),Args...> : std::true_type {};

使用它:

using F = int(void);

template <typename ...Args>
std::enable_if_t<same_args<F,Args...>::value,typename return_type<F>::type> f(Args...) {
    return 42;
}

int main() {
    std::cout << f();
}

Live Demo
我不知道你要的速记符号。已经可以定义一个函数,从给定的函数推断其返回和参数类型。缺点当然是f是一个模板。
那么,允许以下代码的未来扩展有什么缺点呢?
我看不出有什么特别的理由说明这是完全不可能的。但是,通常的考虑因素适用于:它是否带来了现有设施无法实现的新功能?在一个已经很复杂的语言中增加更多的复杂性值得吗?它是否真的使代码更具可读性?Imho不需要语言的扩展,因为你已经可以根据另一个函数的返回和参数类型定义一个函数。

bfhwhh0e

bfhwhh0e2#

最相似的想法是std::function和lambdas。引入一种新的方法来定义函数可能会重复现有的功能,而没有显著的好处。

using F = std::function<int(void)>;

F lambda = [](){
  return  42;
};

在我看来,它也不必要地降低了代码的可读性。

相关问题