考虑以下代码:
#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.
我错过了什么?
在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)
但这似乎有点傻.有没有更好的方法呢?
我使用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) 您可以将对全局对象的引用用作模板参数。例如:
class A {};
template<A& x>
void fun()
{
}
A alpha;
int main()
{
fun<alpha>();
}
Run Code Online (Sandbox Code Playgroud)
在什么情况下引用模板参数可能有用?
在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]两次的.
C++ 11引入char16_t并char32_t便于使用UTF-16和UTF-32编码的文本字符串.但是该<iostream>库仍然只支持wchar_t为多字节I/O 定义的实现.
为什么支持char16_t和char32_t未添加到<iostream>库中以补充wchar_t支持?
考虑以下代码:
#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) 在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)
我尝试过使用各种不同的显示样式,但似乎都没有做我想要的.
我被迫使用表内代码,还是我遗漏了什么?
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)
在课堂里?
根据N4295, C++ 17将允许我计算未知数量的参数的总和,从而:
template<typename ... T>
int sum(T...t)
{
return (... + t);
}
Run Code Online (Sandbox Code Playgroud)
该文档进一步指出我可以使用诸如==或>之类的运算符而不是+.任何人都能想出一个合理的例子,当我想在这样的结构中使用==或>时?
(我意识到人们可以定义==和>为奇怪的课程做一些奇怪的事情,但肯定会违反良好的做法.写作a > b > c > d几乎不是一个好主意,是吗?)
c++ ×7
c++11 ×3
c++17 ×2
templates ×2
base-class ×1
char16-t ×1
char32-t ×1
css ×1
html ×1
html-table ×1
inline ×1
iostream ×1
name-lookup ×1
php ×1
ref ×1
typescript ×1
variables ×1