gpt4 book ai didi

c++ - 模板类体内的模板元编程

转载 作者:太空狗 更新时间:2023-10-29 21:02:02 26 4
gpt4 key购买 nike

我正在尝试在模板类/结构体中编写一个部分专用的模板函数。完成部分特化以执行递归模板元编程。

template<size_t N>
struct my_class {

template<size_t D> double my_func(...){}

template<> double my_func<0>(...){}

double other_func(...){ return my_func<N-1>(...); }
};

但是 g++(使用 -std=c++0x 选项)提示说不能在类/结构中部分特化模板函数并强制我编写模板函数 my_func 在单独的命名空间 类范围之外,就好像它们是静态的,最终传递所有私有(private) 类变量并使代码非常困惑(所有this 很容易引用的成员变量。

有没有一种方法可以在同一个类中进行部分模板特化(我也可以将函数作为 my_class 的私有(private)子类的静态成员)和元编程?

这使代码更清晰,更易于维护。我正在使用 Ubuntu 12.04 和 gcc 4.6。

干杯

最佳答案

您可以通过重载函数(而不是专门化它)然后使用 enable_if 有选择地仅启用一个或其他重载来实现所需的结果:

template<size_t D> typename std::enable_if<D!=0, double>::type my_func(...){}

template<size_t D> typename std::enable_if<D==0, double>::type my_func(...){}

enable_if 约束意味着当 D!=0 只有第一个重载是一个可行的函数,而当 D==0 只有第二个重载是一个可行的函数。

在 C++03 中,您可以使用 boost::enable_if_c 做同样的事情。

我的首选解决方案是将丑陋的 enable_if 用法替换为自定义特征类型,可能是这样的:

template<size_t> struct if_zero { typedef double disable; };
template<> struct if_zero<0> { typedef double enable; };

template<size_t D> typename if_zero<D>::disable my_func(...){}
template<size_t D> typename if_zero<D>::enable my_func(...){}

这具有相同的效果,但更 literate programming风格。

另一种更容易阅读的形式是:

template<bool, typename T> struct If_ { typedef T enable; };
template<typename T> struct If_<false, T> { };

template<bool B, typename T> using If = typename If_<B, T>::enable;

template<size_t D> If<D!=0, double> my_func(...){}
template<size_t D> If<D==0, double> my_func(...){}

我认为 "Concepts Lite"提案将通过像这样限制第二个过载来以更简洁的方式实现这一点:

template<size_t D> double my_func(...){}

template<size_t D> requires (D == 0)
double my_func(...){}

这里的第二个重载只能在 D==0 时调用,并且将由重载决议选择,因为它比第一个重载更受约束。

关于c++ - 模板类体内的模板元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510218/

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