小编Ben*_*Kay的帖子

元组的一个元素可以引用另一个吗?

更新:请参阅下面的完整答案.简短的回答是不,不是直接的.您可以使用std::reference_wrapper指针创建间接引用或更一般地使用指针创建相同的效果(但没有语法糖和附加的引用安全性).

我问,因为元组在C++ 11中构成了一个方便的可变存储单元.从理论上讲,元组的一个元素保持对同一元组中另一个元素的引用听起来是合理的.(用"指针"替换"引用",它在实践中起作用.)魔鬼是构造这样一个元组的细节.请考虑以下示例:

#include <tuple>
#include <iostream>

class A
{
public:
  A() : val(42) { }
  int val;
};

class B
{
public:
  B(A &a) : _a(a) { }
  int val() { return _a.val; }

private:
  A &_a;
};

int main()
{
  A a;
  B b(a);
  std::tuple<A, B> t1(a, b);
  a.val = 24;
  std::cout << std::get<0>(t1).val << "\n"; // 42
  std::cout << std::get<1>(t1).val() << "\n"; // 24

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

元组中的第二个元素t1引用自动变量a而不是第一个元素t1.有没有办法构造一个元组,以便元组的一个元素可以保存对同一元组中另一个元素的引用?我知道你可以通过创建一个引用元组来实现这个结果,如下所示: …

c++ tuples undefined-behavior c++11

8
推荐指数
1
解决办法
353
查看次数

我可以将非类型模板参数传递给重载运算符吗?

我想通过重载()作为getter方法向类中添加一些语法糖.但是,getter方法采用非类型模板参数.考虑一个简单的测试用例:

#include <iostream>

class Foo
{
public:
  template <int i> void get()
  {
    std::cout << "called get() with " << i << std::endl;
  }
  template <int i> void operator()()
  {
    std::cout << "called overloaded () with " << i << std::endl;
  }
};

int main()
{
  Foo foo;
  foo.get<1>();
  foo.get<2>();
  foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果foo<3>();被注释掉,这将按预期编译和运行.C++语法是否支持我正在尝试做的事情,或者我应该放弃并坚持使用getter的命名方法?

c++ templates operator-overloading

5
推荐指数
1
解决办法
220
查看次数

v8 :: FunctionTemplate引用非全局变量

Google的v8文档介绍了如何将全局函数添加到JavaScript上下文中.我们可以使用C++ 11中的新lambda特性轻松实现类似printf的函数:

Handle<ObjectTemplate> global = ObjectTemplate::New();
global->Set(String::New("print"), FunctionTemplate::New(
[](const v8::Arguments &args) -> v8::Handle<v8::Value>
{
  v8::String::AsciiValue ascii(args[0]);
  std::cout << *ascii << "\n";
} ));
Persistent<Context> context = Context::New(NULL, global);
Run Code Online (Sandbox Code Playgroud)

这适用于任何无状态或引用全局C++变量(即std::cout)的全局JavaScript函数.但是,如果我们希望我们的全局JavaScript函数引用非全局C++变量呢?例如,假设我们正在创建几个不同的JavaScript上下文,每个上下文都有自己的print使用不同C++ 的全局函数std::ostream?如果v8函数模板使用的是std::function对象而不是函数指针,我们会这样做:

Persistent<Context> create_context(std::ostream &out)
{
  Handle<ObjectTemplate> global = ObjectTemplate::New();
  global->Set(String::New("print"), FunctionTemplate::New(
  [&out](const v8::Arguments &args) -> v8::Handle<v8::Value>
  {
    v8::String::AsciiValue ascii(args[0]);
    out << *ascii << "\n";
  } ));
  return Context::New(NULL, global);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,v8似乎不支持这一点.我假设(希望?)v8有一种方法可以做一些功能相同的东西,但我发现自己被Doxygen神秘化了v8::FunctionTemplate.尝试过类似事情的人是否愿意将这个过程提炼成更容易理解的东西?我还想学习如何创建绑定到C++对象的现有非全局实例的JavaScript对象的全局实例.

v8 embedded-v8

5
推荐指数
1
解决办法
1714
查看次数

定义后,Javascript类的成员是未定义的

我正在尝试在HTML文档中进行旁白.旁白应该像内联脚注.当读者将鼠标放在子弹上时,会显示旁边的全文.当读者将鼠标移开时,文本会再次隐藏.我正在努力减少使这项工作所需的HTML数量,因此我使用的是<span class="aside"...代替<span onmousover="showAside();"...

无论如何,我对Javascript还是比较陌生的,而且我遇到了一些我似乎无法弄清楚的新手错误.当我在浏览器中加载下面的测试用例时,旁边的文本会被预期的子弹替换.但是,当我鼠标悬停或弹出子弹时,我收到错误"this.element is undefined".但它是在类原型中定义的!是什么赋予了?

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script type="text/ecmascript">
<!--
var asides = [];

// object prototype
function Aside(aside_element)
{
  this.element = aside_element;
  this.text = this.element.innerHTML;
  this.element.onmouseover = this.show;
  this.element.onmouseout = this.hide;
  this.hide();
}
Aside.prototype.hide = function()
{
  this.element.innerHTML = "•";
}
Aside.prototype.show = function()
{
  this.element.innerHTML = this.text;
}

// get all <span> elements of class "aside"
function make_asides()
{
  span_elements = document.getElementsByTagName("span");
  for ( var i = 0, len = …
Run Code Online (Sandbox Code Playgroud)

javascript javascript-events

1
推荐指数
1
解决办法
443
查看次数