C++ C++;MPL或u,以及u实现
我试图阅读boost标题,以了解它们是如何实现C++ C++;MPL或u,以及u实现,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我试图阅读boost标题,以了解它们是如何实现 or_<...> 或 及 和 元函数,以便: 1) 它们可以有任意数量的参数(好的,最多5个参数) 2) 它们具有短路行为,例如: or_<false_,true_,...> 或 不实例化true_389;之后的内容(因此也可以声明但不定义) 不幸的是,预处理器元编程使我无法完成任务:p 提前感谢您提供的任何帮助/建议。我对Boost.MPL不太精通,因此我只能猜测它是如何实现的,但我知道如何实现它 让我们从你
or_<...>
或
及
和
元函数,以便:
1) 它们可以有任意数量的参数(好的,最多5个参数)
2) 它们具有短路行为,例如:
or_<false_,true_,...>
或
不实例化true_389;之后的内容(因此也可以声明但不定义)
不幸的是,预处理器元编程使我无法完成任务:p
提前感谢您提供的任何帮助/建议。我对Boost.MPL不太精通,因此我只能猜测它是如何实现的,但我知道如何实现它 让我们从你的第一个问题开始。这有两个解决方案,一个用于C++98(参数数量有限),另一个用于C++0x。 我们这样定义
或
:
struct null_type { };
template<typename T1 = null_type, typename T2 = null_type, typename T3 = null_type>
struct or_
{
static const bool value = T1::value || T2::value || T3::value;
};
template<typename T1, typename T2>
struct or_<T1, T2, null_type>
{
static const bool value = T1::value || T2::value;
};
template<typename T1>
struct or_<T1, null_type, null_type>
{
static const bool value = T1::value;
};
template<>
struct or_<null_type, null_type, null_type>
{
static const bool value = false;
};
struct true_ { static const bool value = true; };
struct false_ { static const bool value = false; };
这是经典的递归列表处理代码。要熟悉这种风格,请阅读有关函数式编程的内容
第二个问题更简单。或
和和
元函数参数是类型,即空元函数,只有在需要它们的值时才会调用它们(这是C++中逻辑运算符的语义)。使用简单函数,模拟代码为:
bool true_() { return true; }
bool false_() { return false; }
bool or_(bool (*x)(), bool (*y)())
{
return x() || y();
}
以下是短路如何适用于三参数版本
template<typename T1, typename T2, typename T2>
struct or_ : conditional<T1::value, true_, or<T2, T3>>::type
{ };
模板
结构或:条件::类型
{ };
也就是说,如果
T1::value
为true,它将继承true\uu
,否则它将继承或
。您需要一个停止条件,它的工作方式类似于@begemoth shows:Specialize或
对于第一种类型是none\u t
,它将定义它的::value
到false
我不认为C++98版本会起作用,例如,如果参数为“T1,T2,null\u type”,则即使T1::value为true,也需要实例化T2::value。是的,您是对的。我还没有检查短路情况。
bool true_() { return true; }
bool false_() { return false; }
bool or_(bool (*x)(), bool (*y)())
{
return x() || y();
}
template<typename T1, typename T2, typename T2>
struct or_ : conditional<T1::value, true_, or<T2, T3>>::type
{ };