- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道我可以使用 boost::variant
并避免问这个问题。但是使用 boost::variant
涉及到很多丑陋的代码。尤其是来访者杂乱无章。所以,事不宜迟...
我编写了以下模板类来实现柯里化(Currying)函数的惰性求值。 (有关整个代码段,请参阅 my previous question。)
template <typename> class curry;
template <typename _Res>
class curry< _Res() >
{
public:
typedef std::function< _Res() > _Fun;
typedef _Res _Ret;
private:
_Fun _fun;
public:
explicit curry (_Fun fun)
: _fun(fun) { }
operator _Ret ()
{ return _fun(); }
};
所以我想更新它以包括内存。从概念上讲,它非常简单。首先,我必须更换:
private:
_Fun _fun;
public:
explicit curry (_Fun fun)
: _fun(fun) { }
与:
private:
bool _evaluated; // Already evaluated?
union
{
_Fun _fun; // No
_Res _res; // Yes
};
public:
explicit curry (_Fun fun)
: _evaluated(false), _fun(fun) { }
explicit curry (_Res res)
: _evaluated(true), _res(res) { }
但是还有两件事。首先,我必须更新 operator _Ret
,这样,如果它执行惰性求值,那么结果实际上会被内存。其次,我必须添加一个析构函数,以便根据 _evaluated
的值,_fun
或 _res
被销毁。这是我不太确定如何做事的地方。
首先,这是将 _fun
替换为 _res
的正确方法吗?如果没有,我应该怎么做?
operator _Ret ()
{
if (!_evaluated) {
_Fun fun = _fun;
// Critical two lines.
_fun.~_Fun();
_res._Res(fun());
_evaluated = true;
}
return _res;
}
其次,这是选择性销毁_fun
或_res
的正确方法吗?如果没有,我应该怎么做?
~curry ()
{
if (_evaluated)
_res.~_Res();
else
_fun.~_Fun();
}
最佳答案
您不能像其他评论者所说的那样使用 union ,但您可以使用 placement new .
这是一个使用 placement new 的可区分 union 示例:
请注意,您的平台上可能存在 A 和 B 类型的对齐限制,并且此代码不处理强制执行这些限制。
#include <iostream>
#include <cstring>
using namespace std;
struct foo {
foo(char val) : c(val) {
cout<<"Constructed foo with c: "<<c<<endl;
}
~foo() {
cout<<"Destructed foo with c: "<<c<<endl;
}
char c;
};
struct bar {
bar(int val) : i(val) {
cout<<"Constructed bar with i: "<<i<<endl;
}
~bar() {
cout<<"Destructed bar with i: "<<i<<endl;
}
int i;
};
template < size_t val1, size_t val2 >
struct static_sizet_max
{
static const size_t value
= ( val1 > val2) ? val1 : val2 ;
};
template <typename A, typename B>
struct unionType {
unionType(const A &a) : isA(true)
{
new(bytes) A(a);
}
unionType(const B &b) : isA(false)
{
new(bytes) B(b);
}
~unionType()
{
if(isA)
reinterpret_cast<A*>(bytes)->~A();
else
reinterpret_cast<B*>(bytes)->~B();
}
bool isA;
char bytes[static_sizet_max<sizeof(A), sizeof(B)>::value];
};
int main(int argc, char** argv)
{
typedef unionType<foo, bar> FooOrBar;
foo f('a');
bar b(-1);
FooOrBar uf(f);
FooOrBar ub(b);
cout<<"Size of foo: "<<sizeof(foo)<<endl;
cout<<"Size of bar: "<<sizeof(bar)<<endl;
cout<<"Size of bool: "<<sizeof(bool)<<endl;
cout<<"Size of union: "<<sizeof(FooOrBar)<<endl;
}
关于c++ - 如何在 C++ 中实现无参数仿函数及其返回值的有区别 union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436287/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!