Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;MPL或u,以及u实现_C++_Templates_Metaprogramming - Fatal编程技术网

C++ C++;MPL或u,以及u实现

C++ C++;MPL或u,以及u实现,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我试图阅读boost标题,以了解它们是如何实现 or_<...> 或 及 和 元函数,以便: 1) 它们可以有任意数量的参数(好的,最多5个参数) 2) 它们具有短路行为,例如: or_<false_,true_,...> 或 不实例化true_389;之后的内容(因此也可以声明但不定义) 不幸的是,预处理器元编程使我无法完成任务:p 提前感谢您提供的任何帮助/建议。我对Boost.MPL不太精通,因此我只能猜测它是如何实现的,但我知道如何实现它 让我们从你

我试图阅读boost标题,以了解它们是如何实现

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 
{ };