我需要一些类/接口名称来描述一个不可变的有序集合(按输入顺序,如LinkedHashSet).我当然可以像这样使用这个类:
class Foo {
public final Set<Long> frozenOrderedSet;
public Foo(List<Long> input) {
frozenOrderedSet = Collections.unmodifiableSet(new LinkedHashSet(input));
}
}
Run Code Online (Sandbox Code Playgroud)
但这不会澄清我的方法.我想向每个阅读消息来源的人说清楚Set是不可修改和独特的,同时保持它的顺序for(Long l : set){}.
我在这里使用了这个Haskell解释器:https://tryhaskell.org/
当我提供输入时,5 1它告诉我 - 我假设它是类型 - 表达式是类型(Num a, Num (a -> t)) => t:
? 5 1
:: (Num a, Num (a -> t)) => t
Run Code Online (Sandbox Code Playgroud)
现在我试着理解如何解释这个,这就是我提出的.
a是任何Num类型,所以是a -> t.表达式导致某种类型t通过理论上应用1(类型a)到5(类型a -> t)而产生.
这真的让我感到不安,因为我看不出约束是否Num (a -> t)有意义.从理论上讲,它看起来是正确的解释,但我无法找到证明.
这是有道理的,因为它Num是一个多态类型 - 可以是一个函数.
我在C代码中找到了这个构造:
template<typename T, class = decltype(std::declval<T>() < std::declval<T>())>
struct check : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
现在我明白它的作用,但我不明白它是如何工作的.如果type T不支持<-operator ,则抛出编译错误.但是,显然,当更改class为其他内容时,整个事情将无法编译并抛出语法错误.
什么class = sometypename意思?
假设我有一个如下定义的调试函数:
namespace debug {
void report(std::string message);
}
Run Code Online (Sandbox Code Playgroud)
我可以提取一些编译器技巧,在编译时,用a安全地替换每个调用nop.我不想调用一个空函数,我想不要调用该函数.
如果可能的话......我也可以使命名空间"消失"吗?
调试可执行文件将使用DEBUGEXECUTABLE定义的符号进行编译(我可以想象一些带有宏的技巧).
我必须遵循一段代码,我想知道标准对它的说法.它是未定义的行为,定义但未指定的行为或明确定义的行为?
using namespace std;
struct Foo {
mutable int obj;
Foo(Foo&&) = default;
Foo(int arg) : obj(arg) {}
void f() const { obj *= 2; }
};
int main()
{
Foo&& a = Foo(5); // Binds temporary, lifetime ends with program
const Foo& b = a; // Binds a, lifetime ends with program
Foo c(std::move(a)); // Moves from a
// a now in defined, but unspecified state
b.f(); // ??
cout << b.obj << endl; // May output 10
return …Run Code Online (Sandbox Code Playgroud) 我刚刚创建了一个非常小的项目,当我遇到一个我无法追踪的有趣的编译器错误时,我认为我可以立即做(这是关于基本代理).这是代码的简化版本:
class NoComp {
};
class Comp {
bool operator==(const Comp& other)
{ std::cout << "Working!" << std::endl; return true;}
};
struct Test {
template<typename T>
Test(T&& obj) {}
bool operator==(const Test& other);
};
int main()
{
Test a(Comp());
Test b(NoComp());
a.operator ==(b);
}
Run Code Online (Sandbox Code Playgroud)
当编译这将产生以下编译器错误g++ version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC) 在这里找到:
main.cpp: In function 'int main()':
main.cpp:22:13: error: request for member 'operator==' in 'a', which is
of non-class type 'Test(Comp (*)())'
a.operator ==(b);
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这个错误意味着什么以及它为何存在.那里发生了什么,它是一个bug还是标准所涵盖的?如果可以的话,我该如何避开?
我试图定义一个模板化的基类,它定义了一个由用户覆盖的虚拟接口.在某些情况下,拥有此方法的默认实现是有意义的,但对于所有类型参数都不是这样.考虑一下:
template<typename T>
struct supplier
{
virtual std::unique_ptr<T> supply(std::istream& moreData) = 0;
};
Run Code Online (Sandbox Code Playgroud)
现在我想提供以下默认实现,因为它T是默认的constructible(std::is_default_constructible):
std::unique_ptr<T> supply(std::istream& moreData)
{
return std::unique_ptr<T>(new T);
}
Run Code Online (Sandbox Code Playgroud)
问题不在于如何为适当的方法定义此函数,T而是如何使其显示为纯虚函数 - 从而强制用户实现 - 当它未定义时,如果是正常的虚函数.
我想我只是缺少一些明显的解决方案.我试图专门化,struct supplier但这意味着我必须两次定义接口的其余部分,所以它绝对不是一个扩展解决方案.这也意味着我必须提供两次接口的其余部分.
对于具有许多虚拟功能的丰富基类,是否有一个经济实惠的解决方案,可以提供实现还是纯虚拟?
我知道这样做是错误的,但是我试着了解幕后发生的事情(如果你可以用鸭子类型来扩展它).代码如下:
>>> a = 2
>>> class C(a):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么int()在这个例子中会被调用.这是类型,a但我不明白为什么这在这里很重要.
C++标准不需要整数类型的精确大小,这有时会导致非常意外的结果.然后,一些聪明的人引入了<cstdint>包含(可选)typedef 的头文件,例如int64_t具有正好64位宽度的类型.这不是想要的.
是否存在(可能是可选的)整数类型,其属性sizeof(mysterious_type) == 2适用于定义的任何系统?
推理:我正试图弄清楚系统的结束.为此,在审查了这个板上的许多问题之后,我虽然只想定义一个大小为2的整数类型,给它分配一个并检查endianess,如下所示:
enum endianess { LITTLE_ENDIAN, BIG_ENDIAN };
typedef utwowitdhtype test_t; // some unsigned type with width 2
endianess inspectSystem() {
static_assert(sizeof(twowitdhtype) == 2, "twowitdhtype is not size 2??!?!!");
test_t integral = 0x1;
return *reinterpret_cast<char*>(&integral) == 0 ? BIG_ENDIAN : LITTLE_ENDIAN;
}
Run Code Online (Sandbox Code Playgroud)
虽然这是为什么我会对这种类型感兴趣的原因,但找到这样的类型不是为了解决问题而是出于好奇.
c++ ×6
c++11 ×3
c++14 ×2
templates ×2
types ×2
class ×1
debugging ×1
haskell ×1
inheritance ×1
java ×1
pure-virtual ×1
python ×1
reference ×1
unmodifiable ×1