小编oz1*_*1cz的帖子

这个std :: ref行为是否合乎逻辑?

考虑以下代码:

#include <iostream>
#include <functional>

int xx = 7;

template<class T>
void f1(T arg)
{
    arg += xx;
}

template<class T>
void f2(T arg)
{
    arg = xx;
}

int main()
{
    int j;

    j=100;
    f1(std::ref(j));
    std::cout << j << std::endl;

    j=100;
    f2(std::ref(j));
    std::cout << j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

执行时,此代码输出

107
100
Run Code Online (Sandbox Code Playgroud)

我原以为第二个值是7而不是100.

我错过了什么?

c++ ref c++11

68
推荐指数
3
解决办法
2513
查看次数

Typescript转换为boolean

在Typescript中我可以这样做:

var xxx : some_type;

if (xxx)
    foo();
else
    bar();
Run Code Online (Sandbox Code Playgroud)

这里xxx将被视为布尔值,无论其类型如何.

我想在函数参数中做同样的事情.我有这个功能:

function foo(b : boolean) { ... }
Run Code Online (Sandbox Code Playgroud)

我希望能够调用foo(xxx)并将xxx视为布尔值,无论其类型如何.但是Typescript不允许这样做.

我试过这个:

foo(<boolean>xxx);
Run Code Online (Sandbox Code Playgroud)

但是那个Typescript也不允许这样做.

我可以做这个:

foo(xxx ? true : false);
Run Code Online (Sandbox Code Playgroud)

但这似乎有点傻.有没有更好的方法呢?

typescript

51
推荐指数
6
解决办法
6万
查看次数

使相同的C++类型别名不兼容

我使用std::vector<int>两种不同的信息.我想确保我不会意外地混合这两种用途.

简而言之,我想要像这段代码一样失败:

#include <vector>

using A = std::vector<int>;
using B = std::vector<int>;

void fa(const A&);
void fb(const B&);

void fun()
{
    A ax;
    B bx;

    fa(bx);
    fb(ax);
}
Run Code Online (Sandbox Code Playgroud)

此代码编译,即使fa期望类型的参数A.显然,A并且B是相同的.

使这段代码正确编译的最简单方法是什么:

fa(ax);
fb(bx);
Run Code Online (Sandbox Code Playgroud)

并使此代码失败:

fa(bx);
fb(ax);
Run Code Online (Sandbox Code Playgroud)

当然,我可以std::vector<int>在另一个类中包装,但是我需要重写它的接口.或者,我可以继承std::vector<int>,但这通常是气馁的.

简而言之,我需要两个不兼容的版本std::vector<int>.

编辑

有人建议Strong typedef可以解决这个问题.这只是部分正确.如果我使用BOOST_STRONG_TYPEDEF(std::vector<int>, A),我需要添加一些恼人的演员阵容.例如,而不是

A ax{1,3,5};
Run Code Online (Sandbox Code Playgroud)

我需要用

A ax{std::vector<int>{1,3,5}};
Run Code Online (Sandbox Code Playgroud)

而不是

for (auto x : ax) ...
Run Code Online (Sandbox Code Playgroud)

我需要用

for (auto x : (std::vector<int>)ax) ...
Run Code Online (Sandbox Code Playgroud)

c++ c++11

37
推荐指数
2
解决办法
3026
查看次数

引用模板参数的目的

您可以将对全局对象的引用用作模板参数。例如:

class A {};

template<A& x>
void fun()
{
}

A alpha;

int main()
{
    fun<alpha>();
}
Run Code Online (Sandbox Code Playgroud)

在什么情况下引用模板参数可能有用?

c++ templates

28
推荐指数
2
解决办法
575
查看次数

分配if变量是否已设置

在PHP中,我发现自己经常编写这样的代码:

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?最好是一个不需要我写$the->very->long->variable[$index]两次的.

php variables

23
推荐指数
2
解决办法
1万
查看次数

在I/O中使用char16_t和char32_t

C++ 11引入char16_tchar32_t便于使用UTF-16和UTF-32编码的文本字符串.但是该<iostream>库仍然只支持wchar_t为多字节I/O 定义的实现.

为什么支持char16_tchar32_t未添加到<iostream>库中以补充wchar_t支持?

c++ iostream c++11 char16-t char32-t

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

g ++和MSVS之间的名称查找差异

考虑以下代码:

#include <iostream>

namespace N {
    class A {};
    void f(A a) { std::cout << "N::f\n"; }
}

void f(int i) { std::cout << "::f\n"; }

template <typename T>
class Base {
  public:
    void f(T x) { std::cout << "Base::f\n"; }
};


template <typename T>
class X : public Base<T> {
  public:
    void g() {
        T t;
        f(t);
    }
};

int main()
{
    X<N::A> x1;
    x1.g();

    X<int> x2;
    x2.g();
}
Run Code Online (Sandbox Code Playgroud)

该代码旨在研究名称查找在C++中的工作方式.

如果我用GNU C++(版本6.1.0)编译该程序,它会打印:

N::f
::f
Run Code Online (Sandbox Code Playgroud)

但如果我用Microsoft Visual Studio 2015编译它,它会打印:

Base::f …
Run Code Online (Sandbox Code Playgroud)

c++ templates base-class dependent-name name-lookup

20
推荐指数
2
解决办法
555
查看次数

如何内联HTML表格

在HTML中我想显示一个小表作为段落的一部分.一种方法是:

<table>
  <tr>
    <td>
      Before 
      <table style="display:inline;"><tr><td>a</td><td>b</td></tr> <tr><td>c</td><td>d</td></tr> </table>
      After
    </td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

这产生了这个漂亮的布局:

       a b
Before     After
       c d
Run Code Online (Sandbox Code Playgroud)

这正是我想要的.

但是,当我真正想要的是在一个段落中使用一个表时,在表格中使用表格似乎相当愚蠢.但是,如果我尝试使用此HTML:

<p>
  Before 
    <table style="display:inline;"><tr><td>a</td><td>b</td></tr> <tr><td>c</td><td>d</td></tr></table>
  After
</p>
Run Code Online (Sandbox Code Playgroud)

我得到这个丑陋的布局:

Before
a b
    After
c d
Run Code Online (Sandbox Code Playgroud)

我尝试过使用各种不同的显示样式,但似乎都没有做我想要的.

我被迫使用表内代码,还是我遗漏了什么?

html css html-table

19
推荐指数
3
解决办法
7万
查看次数

为什么静态内联变量需要"内联"?

C++ 17允许定义静态成员变量:

class X {
  public:
    static inline int i = 8;
};
Run Code Online (Sandbox Code Playgroud)

要求inline规范的理由是什么?为什么不简单地允许程序员写

    static int i = 8;
Run Code Online (Sandbox Code Playgroud)

在课堂里?

c++ inline c++17

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

C++中的折叠表达式17 - 用于比较运算符的用例

根据N4295, C++ 17将允许我计算未知数量的参数的总和,从而:

template<typename ... T>
int sum(T...t)
{
    return (... + t);
}
Run Code Online (Sandbox Code Playgroud)

该文档进一步指出我可以使用诸如==或>之类的运算符而不是+.任何人都能想出一个合理的例子,当我想在这样的结构中使用==或>时?

(我意识到人们可以定义==和>为奇怪的课程做一些奇怪的事情,但肯定会违反良好的做法.写作a > b > c > d几乎不是一个好主意,是吗?)

c++ fold-expression c++17

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