繁体   English   中英

用作模板参数,对返回类型强制约束?

[英]Function as template parameter, enforce constraint on return type?

我有一个模板函数,它接受一个函数作为参数,比如

template <typename Function>
void apply(Function f) {
    // do something that invokes f(...)
}

我想限制它,以便f()的返回类型必须是某种类型,比如int

我不想约束f的参数(例如,假设它需要三个int作为参数)。

这是一个天真的解决方案,它结合了std::enable_if_tstd::is_same_vdecltypestd::declval

#include <type_traits>

template <
    typename Function,
    typename = std::enable_if_t<
        std::is_same_v<
            decltype(std::declval<Function>()(
                std::declval<int>(),
                std::declval<int>(),
                std::declval<int>()
            )),
            int
        >
    >
>
void apply(Function f) {
    f(1,2,3);
}

int foo(int x, int y, int z);
char bar(int x, int y, int z);

int main()
{
    apply(foo);
    apply(bar);
}

现场演示

foo有效,但bar无效。

对于foo替代重载,这也应该像预期的那样表现,因为部分机制指定了我们将提供给Function的参数类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM