gpt4 book ai didi

c++ - 模板类型的特征特化

转载 作者:行者123 更新时间:2023-11-30 01:48:01 25 4
gpt4 key购买 nike

我有一个特征可以返回关于某个类的一些信息,例如维数:

template< typename T >
struct NumDims;

对于“普通”类,这很容易专门化:

template<>
struct NumDims< MyClass >: std::integral_constant< unsigned, 3 >{};

但是我有一些繁重的模板化类,它们都有一个共同的静态 constexpr,例如:

template< class T, class U, class V, bool x, bool y, bool z >
struct TemplateClass{
static constexpr unsigned numDims = ...;
}

特化看起来丑陋且容易出错:

template< class T, class U, class V, bool x, bool y, bool z >
struct NumDims< TemplateClass<T,U,V,x,y,z> >{
static constexpr unsigned value = TemplateClass<T,U,V,x,y,z>::numDims;
}

我尝试使用可变参数模板:

template< class... T >
struct NumDims< TemplateClass<T...> >{
static constexpr unsigned value = TemplateClass<T...>::numDims;
}

但这会使我的编译器 (gcc 4.8.2) 崩溃:
内部编译器错误:在 unify_one_argument 中,位于 cp/pt.c:15506

有什么想法可以用这种“探测”方式吗?

最佳答案

您的问题是您的 TemplateClass 类模板中混合了类型参数和非类型参数,因此您不能有可变类型参数。据我所知,目前没有办法像这样混合类型和非类型参数,除非将非类型参数包装在一些虚拟模板中。

幸运的是,您可以回避整个问题,只进行部分特化,当您传入的类型具有 numDims 静态成员时启用该特化:

template <typename T, typename = void>
struct NumDims;

template<>
struct NumDims< MyClass >: std::integral_constant< unsigned, 3 >{};

template< class T >
struct NumDims< T, void_t<decltype(T::numDims)> >{
static constexpr unsigned value = T::numDims;
};

这使用了还不是标准的 void_t,所以你可以使用这样一个简单的实现:

template <typename...>
struct voider { using type = void; };
template <typename... Ts> using void_t = typename voider<Ts...>::type;

关于c++ - 模板类型的特征特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30751169/

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