c_cpp 使用C ++ 17模板推导指南作为元函数。请参阅http://melpon.org/wandbox/permlink/lVFBj7shPP0fUMuQ

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用C ++ 17模板推导指南作为元函数。请参阅http://melpon.org/wandbox/permlink/lVFBj7shPP0fUMuQ相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <string>
#include <vector>


// Basic vocabulary first:

// A function
template<typename Result>
struct Function
{
    template<typename Tag, typename... Args>
    constexpr Function(Tag, Args...) {}
    
    using type = Result;
};

// A type
template<typename T>
struct Type
{
    constexpr Type() = default;
    using type = T;  
};

template<typename T, typename U>
constexpr bool operator==(const Type<T>&, const Type<U>&)
{
    return std::is_same<T, U>::value;
}

template<typename T, typename U>
constexpr bool operator!=(const Type<T>&, const Type<U>&)
{
    return !std::is_same<T, U>::value;
}

// A type 'factory'
template<typename T>
constexpr Type<T> type = Type<T>();

// A function evaluation operation
template<typename Function>
constexpr auto eval(Function)
{
    return type<typename Function::type>;
}

// Now let's have fun:

struct AddConst {};
struct AddPointer {};

template<typename T>
Function(AddConst, Type<T>) -> Function<const T>;

template<typename T>
Function(AddPointer, Type<T>) -> Function<T*>;

constexpr auto constInt = eval(Function(AddConst(), type<int>));
constexpr auto intPtr   = eval(Function(AddPointer(), type<int>));

static_assert(type<const int> == constInt, "???");
static_assert(type<int*> == intPtr, "???");

int main()
{}

以上是关于c_cpp 使用C ++ 17模板推导指南作为元函数。请参阅http://melpon.org/wandbox/permlink/lVFBj7shPP0fUMuQ的主要内容,如果未能解决你的问题,请参考以下文章

C++17 中 std::unordered_map 的推导指南

如何编写聚合模板别名的推导指南?

什么是模板推导中的部分排序程序

类数据成员中可以使用模板参数推导吗?

简化代码,提高效率:C++ auto关键字的魅力

c_cpp 旅游指南