gpt4 book ai didi

c++ - 使用 SFINAE 进行模板类特化

转载 作者:IT老高 更新时间:2023-10-28 12:33:38 26 4
gpt4 key购买 nike

假设我有这些声明

template<typename T> class User;
template<typename T> class Data;

并希望实现 User<>对于 T = Data<some_type> 以及从 Data<some_type> 派生的任何类 但也允许在别处定义的其他特化。

如果我还没有类模板的声明 User<> ,我可以简单地

template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };

在哪里

template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };

但是,这有两个模板参数,因此与前面的声明冲突,其中 User<>仅使用一个模板参数声明。还有什么我可以做的吗?

(注意

template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };

不起作用(默认模板参数不能用于部分特化),也没有

template<typename T> class User<Data<T>> { /*...*/ };

因为它不允许从 Data<> 派生的类型, 也没有

template<typename T>
class User<typename std::enable_if<is_Data<T>::value,T>::type>
{ /*...*/ };

因为模板参数T不用于偏特化。)

最佳答案

IF User<> 的原始声明可以适应

template<typename, typename=std::true_type> class User;

然后我们可以找到解决方案(按照 Luc Danton 的评论,而不是使用 std::enable_if )

template<typename>
struct is_Data : std::false_type {};
template<typename T>
struct is_Data<Data<T>> : std::true_type {};

template<typename T>
class User<T, typename is_Data<T>::type >
{ /* ... */ };

但是,这并没有回答原来的问题,因为它需要更改 User 的原始定义.我仍在等待更好的答案。这可能最终证明没有其他解决方案是可能的

关于c++ - 使用 SFINAE 进行模板类特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12858839/

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