我有这些课程:
#include <type_traits>
template <typename T>
class A {
public:
static_assert(std::is_default_constructible_v<T>);
};
struct B {
struct C {
int i = 0;
};
A<C> a_m;
};
int main() {
A<B::C> a;
}
Run Code Online (Sandbox Code Playgroud)
编译时,a_m不是默认可构造的,而是a可构造的。
更改C为:
struct C {
int i;
};
Run Code Online (Sandbox Code Playgroud)
一切安好。
使用 Clang 9.0.0 测试。
所以在Ruby中有一个指定无穷大的技巧:
1.0/0
=> Infinity
Run Code Online (Sandbox Code Playgroud)
我相信Python你可以做这样的事情
float('inf')
Run Code Online (Sandbox Code Playgroud)
这些仅仅是一些例子,我确信大多数语言在某种程度上都具有无限性.你什么时候才能在现实世界中使用这个结构?为什么在一个范围内使用它比仅使用布尔表达式更好?例如
(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true
Run Code Online (Sandbox Code Playgroud)
总而言之,我正在寻找的是使用Infinity的现实世界的理由.
编辑:我正在寻找真实世界的代码.当人们真正使用它时,这就是你可以"使用它"的全部和好处.
我经常需要在C++中处理动态分配的数组,因此依赖于Boost for scoped_array,shared_array等.在阅读了Stroustrup的C++ 11 FAQ和C++ 11 Reference Wiki之后,我无法找到C++ 11标准提供的这些动态数组包装器的合适替代品.有什么东西我忽略了,还是我必须继续依赖Boost?
非常感谢您的帮助!
我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做
class MyClass {
static int myDatum;
static {
/* do some computation which sets myDatum */
}
}
Run Code Online (Sandbox Code Playgroud)
除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?
我想要解决以下两个选项:
对于第二种选择,我在考虑:
class StaticInitialized {
static bool staticsInitialized = false;
virtual void initializeStatics();
StaticInitialized() {
if (!staticsInitialized) {
initializeStatics();
staticsInitialized = true;
}
}
};
class MyClass : private StaticInitialized {
static int myDatum;
void initializeStatics() {
/* computation which sets myDatum */
}
};
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为C++(目前?)不允许初始化非const静态成员.但是,至少可以通过表达式将静态块的问题减少到静态初始化的问题......
我想在编译时使用类型的名称.例如,假设我写了:
constexpr size_t my_strlen(const char* s)
{
const char* cp = s;
while(*cp != '\0') { cp++; };
return cp - s;
}
Run Code Online (Sandbox Code Playgroud)
现在我希望:
template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());
Run Code Online (Sandbox Code Playgroud)
但是,唉,typeid(T).name()只是const char*,而不是constexpr ......还有其他一些constexpr方法来获得一个类型的名字吗?
我正在一个我无法访问C++标准库的环境中编写C++代码,特别是不能访问std::numeric_limits.假设我想实施
template <typename T> constexpr T all_ones( /* ... */ )
Run Code Online (Sandbox Code Playgroud)
专注于无符号整数类型,我放在那里?具体来说,static_cast<T>(-1)够好吗?(根据我的猜测,我可以将其他类型视为无符号字符数组.)
如何ls在不解压缩的情况下从命令shell 获取等效的.zip文件(而不是gzip)?也就是说,如何列出我的.zip存档中压缩的不同文件?
我想使用一个三元组类,尽可能与std :: pair类似.STL似乎没有.我不想使用太重的东西,比如Boost.是否有一些有用的FOSS非限制性许可三联类可以从某个地方解除?我应该自己动手吗?我应该完全做些什么吗?
编辑:关于std::tuple......
特定于三胞胎的课程真的没有益处吗?我的意思是,有了元组,我做不到
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
Run Code Online (Sandbox Code Playgroud)
我可以吗?我不是必须键入dede个人类型组合三元组吗?
先来看看什么C++入门谈到unique_ptr和shared_ptr:
$ 16.1.6.效率和灵活性
我们可以确定
shared_ptr不将删除器作为直接成员,因为删除器的类型直到运行时才知道.因为删除器的类型是a
unique_ptr类型的一部分,所以删除器成员的类型在编译时是已知的.删除器可以直接存储在每个unique_ptr对象中.
所以似乎shared_ptr没有直接的删除成员,但unique_ptr确实如此.然而,另一个问题的最高投票回答说:
如果将deleter作为模板参数提供(如
unique_ptr),则它是类型的一部分,您不需要在此类型的对象中存储任何其他内容.如果将deleteter作为构造函数的参数传递(如shared_ptr),则需要将其存储在对象中.这是额外灵活性的代价,因为您可以为相同类型的对象使用不同的删除器.
引用的两段完全相互矛盾,让我感到困惑.更重要的是,许多人说unique_ptr是零开销,因为它不需要将删除器存储为成员.但是,正如我们所知,unique_ptr有一个构造函数unique_ptr<obj,del> p(new obj,fcn),这意味着我们可以将删除函数传递给它,因此unique_ptr似乎已将删除函数存储为成员.真是一团糟!
我正在使用 C++ 库 ( strf ),其中的某处具有以下代码:
namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }
template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
现在,我想strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)在我的代码中使用。但是如果我这样做,我会收到以下错误(使用 CUDA 10.1 的 NVCC):
error: more than one instance of overloaded function "strf::range" matches the argument list:
function template "auto strf::range(ForwardIt, ForwardIt)"
function template "auto strf::range(const Range &, const CharT *)" …Run Code Online (Sandbox Code Playgroud) c++ nvcc overload-resolution c++11 template-argument-deduction
c++ ×7
c++11 ×3
bash ×1
boost ×1
c++14 ×1
compile-time ×1
constexpr ×1
equivalent ×1
idiomatic ×1
idioms ×1
infinity ×1
java ×1
linux ×1
nsdmi ×1
nvcc ×1
python ×1
reflection ×1
ruby ×1
shell ×1
static-block ×1
stdtuple ×1
template-argument-deduction ×1
triplet ×1
unique-ptr ×1
unix ×1
wrapper ×1
zip ×1