gpt4 book ai didi

c++ - 基于模板参数的条件编译时包含/排除代码?

转载 作者:IT老高 更新时间:2023-10-28 12:54:40 29 4
gpt4 key购买 nike

考虑以下类,其内部结构为 Y被用作一种类型,例如。在模板中,稍后:

template<int I>
class X{
template<class T1>
struct Y{};

template<class T1, class T2>
struct Y{};
};

现在,这个例子显然不能编译,第二个 X<I>::Y 的错误已经定义或者模板参数过多。
我想在没有(额外)部分特化的情况下解决这个问题,因为 int I参数不是唯一的,它的位置在不同的部分专业中可能有所不同(我的实际结构看起来 more like this ,以上只是为了简单起见),所以我想要 one class fits every I解决方案。


我的第一个想法显然是enable_if ,但这对我来说似乎失败了,例如。我仍然遇到同样的错误:

// assuming C++11 support, else use boost
#include <type_traits>

template<int I>
class X{
template<class T1, class = std::enable_if<I==1>::type>
struct Y{};

template<class T1, class T2, class = std::enable_if<I==2>::type>
struct Y{};
};

所以,由于 enable_if失败了,希望有另一种方式来实现下面的编译时检查:

template<int I>
class X{
__include_if(I == 1){
template<class T1>
struct Y{};
}

__include_if(I == 2){
template<class T1, class T2>
struct Y{};
}
};

这只是为我节省了很多代码重复,但如果有可能的话,我会非常高兴。
编辑:可悲的是,我不能使用明显的:可变参数模板,因为我使用的是 Visual Studio 2010,所以我只能使用那里支持的 C++0x 东西。 :/

最佳答案

这里有两个问题:

  1. enable_if 适用于部分特化,而非主要模板。
  2. 外部可见参数的数量由主模板决定,其中可能只有一个。

回答 1。

正如您在聊天中所建议的,模板的链接列表可以模拟可变参数包。

template<int I>
class X{
template<class list, class = void>
struct Y;

template<class list>
struct Y< list, typename std::enable_if<I==1>::type > {
typedef typename list::type t1;
};

template<class list>
struct Y< list, typename std::enable_if<I==2>::type > {
typedef typename list::type t1;
typedef typename list::next::type t2;
};
};

如果你最终得到 next::next::next 垃圾,编写元函数或使用 Boost MPL 很容易。


回答 2。

不同数量的模板可以类似地命名,但如果它们嵌套在 SFINAE 控制的类型中,它们仍然保持不同。

template<int I>
class X{
template<typename = void, typename = void>
struct Z;

template<typename v>
struct Z< v, typename std::enable_if<I==1>::type > {
template<class T1>
struct Y{};
};

template<typename v>
struct Z< v, typename std::enable_if<I==2>::type > {
template<class T1, class T2>
struct Y{};
};
};

X<1>::Z<>::Y< int > a;
X<2>::Z<>::Y< char, double > b;

关于c++ - 基于模板参数的条件编译时包含/排除代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659064/

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