C++17中如何实现由T推导Context的类型级函数?
解决C++17中模板类依赖类型推导Context的问题
你需要的类型级映射可以通过模板特化+SFINAE实现,完全兼容C17,不需要C20 Concepts。以下是具体实现方案:
1. 定义FooContext类型映射结构
首先声明主模板,然后针对内置类型和带内部Context的自定义类型分别做特化:
#include <string> #include <type_traits> // 用于std::void_t // 主模板声明(仅声明,不定义) template <typename T> struct FooContext; // 针对int的特化:指定Context为std::string template <> struct FooContext<int> { using type = std::string; }; // 针对double的特化:同样指定Context为std::string template <> struct FooContext<double> { using type = std::string; }; // 通用特化:匹配所有带有public内部Context类型的自定义类型 template <typename T> struct FooContext<T, std::void_t<typename T::Context>> { using type = typename T::Context; };
2. 定义别名模板简化使用
为了避免每次都写typename FooContext<T>::type,可以定义一个别名模板:
template <typename T> using FooContext_t = typename FooContext<T>::type;
3. 修改Foo类
现在可以直接在Foo中使用FooContext_t<T>获取对应的Context类型:
template <typename T> class Foo { T value; FooContext_t<T> context; };
说明
- 内置类型(如int、double)会匹配对应的特化版本,自动使用
std::string作为Context; - 自定义类型(如
NodeValue)只要包含public的Context内部类型,就会自动匹配通用特化,使用T::Context; - 如果需要支持其他内置类型,只需添加对应的特化即可。
内容的提问来源于stack exchange,提问作者rprospero
相关产品推荐
相关产品推荐

