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 旅游指南