gpt4 book ai didi

c++ - 如何使用 C++ 模板模拟高阶函数?

转载 作者:行者123 更新时间:2023-11-28 02:21:02 27 4
gpt4 key购买 nike

这是模板 lessThan这是一个函数。

template<int n>
struct Box
{
};

template<typename T>
struct Unbox_;

template<int n>
struct Unbox_<Box<n>>
{
static constexpr int value = n;
};

template<typename T>
constexpr int unbox = Unbox_<T>::value;

template<typename T, typename U>
struct LessThan_
{
static constexpr bool value = unbox<T> < unbox<U>;
};

template<typename T, typename U>
constexpr bool lessThan = LessThan_<T, U>::value;

#include <iostream>

int main()
{
std::cout << lessThan<Box<1>, Box<2>> << '\n';
std::cout << lessThan<Box<3>, Box<2>> << '\n';
}

我现在想做这样的事情

lessThan<Box<1>><Box<2>> == true

这当然不是有效的 C++。为什么我需要这个?请考虑以下内容。

template<typename T>
struct LessThanOne_
{
static constexpr bool value = unbox<T> < 1;
};

template<typename T>
constexpr bool lessThanOne = LessThanOne_<T>::value;

在某些地方我需要传递一个带有一个参数的模板,而不是传递 lessThanOne , 我想传递类似 lessThan<Box<1>> 的东西,这样我就不需要对所有情况进行硬编码。有什么解决方法吗?

最佳答案

您正在寻找 calked currying 的概念。查一下。这是一个快速组合的示例实现:

template<template<class,class> class fn>
struct curry
{
template <class A>
struct apply1
{
template <class B>
using apply = fn<A,B>;
};
template<class A>
using apply = apply1<A>;
};

// That's it. Below is a test rig.

template <class>
struct test1 {};

template <template<class>class>
struct test2{};

// a meta function to test
template <class, class>
struct myfn {};

// same function, curried
using myfngood = curry<myfn>;

// fully applied myfngood is a type
test1 <myfngood::apply<int>::apply<char*>> t1;

// partially applied myfngood is a template
test2 <myfngood::apply<int>::apply> t2;

关于c++ - 如何使用 C++ 模板模拟高阶函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461748/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com