我在Sphinx尝试一些相当基本的东西.我有一些图像,但我更喜欢让它们保持很小,我想让用户点击它们来获得更大的图像.我没有找到一种语法结合image:或figure:与ref:或link:.
.. image:: _static/my_image_small.png
Run Code Online (Sandbox Code Playgroud)
我在同一个文件夹中my_image_large.png.
如果您想出一个解决方案,那么较大的图像应该是一个带有显式链接的文件,还是我创建一个带有附加image:标记的reSt文件?另一种方法是使用reSt文件中的图像大小,但后来我仍然不知道如何创建从小图像到大图像的链接.
感谢你们对我的帮助.
我对Boost的侵入式指针有一个问题.它是布尔转换运算符检查x.get() != 0.但是,下面的代码在标记点处失败.为什么会这样?
我猜我可能与delete没有设置指针0(或nullptr)的事实有关.如果不是这样,我怎么能有效地使用侵入式指针?我希望能够使用像常规指针这样的侵入式指针,例如,在表达式中x && x->foo(),但这个人工制品似乎排除了它.
#include <atomic>
#include <boost/intrusive_ptr.hpp>
struct T
{
T() : count(0u) { }
size_t ref_count()
{
return count;
}
std::atomic_size_t count;
};
void intrusive_ptr_add_ref(T* p)
{
++p->count;
}
void intrusive_ptr_release(T* p)
{
if (--p->count == 0u)
delete p;
}
int main()
{
boost::intrusive_ptr<T> x;
x = new T;
assert(x->ref_count() == 1);
auto raw = x.get();
intrusive_ptr_add_ref(raw);
intrusive_ptr_add_ref(raw);
assert(x->ref_count() == 3);
intrusive_ptr_release(raw);
intrusive_ptr_release(raw); …Run Code Online (Sandbox Code Playgroud) 是否可以推断CRTP基类中模板化成员函数的返回类型?
推断参数类型效果很好,但它返回类型失败.考虑下面的例子.
#include <iostream>
template <typename Derived>
struct base
{
template <typename R, typename T>
R f(T x)
{
return static_cast<Derived&>(*this).f_impl(x);
}
};
struct derived : base<derived>
{
bool f_impl(int x)
{
std::cout << "f(" << x << ")" << std::endl;
return true;
}
};
int main()
{
bool b = derived{}.f(42);
return b ? 0 : 1;
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
bool b = derived{}.f(42);
~~~~~~~~~~^
crtp.cc:7:5: note: candidate template ignored: couldn't infer template argument 'R'
R f(T x)
^
1 …Run Code Online (Sandbox Code Playgroud) 我正在努力使C++ 11代码Clang兼容并遇到GCC> = 4.6接受代码并且Clang> = 3.1不接受的情况.克朗认为一个candidate constructor not viable.
这是一个精简的示例来说明问题:
#include <utility>
template <typename...>
struct T;
template<>
struct T<>
{
typedef T super;
constexpr T() { }
template <typename... Args>
T(Args&&...) { }
};
template <typename Head, typename... Tail>
struct T<Head, Tail...> : T<Tail...>
{
typedef T<Tail...> super;
Head head;
T(Head arg) : super(), head(std::move(arg)) { }
};
struct void_type
{
constexpr void_type() { }
constexpr void_type(const void_type&) { }
void_type& operator=(const void_type&) = default;
template …Run Code Online (Sandbox Code Playgroud) 我想在实例之间有效地复制数据std::streambuf.也就是说,我想在它们之间铲除数据块,而不是执行逐字符复制.例如,这不是我想要的:
stringbuf in{ios_base::in};
stringbuf out{ios_base::out};
copy(istreambuf_iterator<char>{in},
istreambuf_iterator<char>{},
ostreambuf_iterator<char>{out});
Run Code Online (Sandbox Code Playgroud)
这有一个语法糖,有更多的错误检查:
ostream os{&out};
os << ∈
Run Code Online (Sandbox Code Playgroud)
这是operator<<(basic_streambuf<..>*)我标准库(Mac OS X,XCode 7)中实现的片段:
typedef istreambuf_iterator<_CharT, _Traits> _Ip;
typedef ostreambuf_iterator<_CharT, _Traits> _Op;
_Ip __i(__sb);
_Ip __eof;
_Op __o(*this);
size_t __c = 0;
for (; __i != __eof; ++__i, ++__o, ++__c)
{
*__o = *__i;
if (__o.failed())
break;
}
Run Code Online (Sandbox Code Playgroud)
底线是:这仍然是每个字符的复制.我希望标准库使用的算法依赖于streambuffers的块级成员函数,sputn而sgetn不是每个字符的传输.标准库是否提供了这样的算法,还是我必须自己编写?
是否存在std::streambuf将多字节值转换为网络字节顺序的类似机制?特别是,Boost Asio能提供如此原始的东西吗?以下是我希望流缓冲区执行的示例:
uint64_t x = 42ull;
network_streambuf b1;
std::ostream os(&b1);
os << 42ull; // htonll
network_streambuf b2;
std::istream is(&b2);
uint64_t y;
is >> y; // ntohll
Run Code Online (Sandbox Code Playgroud)
编辑:答案表明这是思考问题的错误方法:流缓冲区只提供对字符序列的访问,他们的工作不是执行格式化的I/O或转换.我可能会实现一个小缓冲类,它为转换提供必要的重载operator<<并operator>>执行转换.
我有一个小数纪元时间戳,表示为double,我想转换为适当的std::chrono::time_point.这个时代是自1970年1月1日以来的常见UNIX时代.我知道存在std::chrono::system_clock::from_time_t,但是time_t没有一个小部分.使用C++ 11的最佳方法是什么?
这个问题与boost :: posix_time :: ptime的unix时间戳有关,除了它要求的是C++ 11而不是Boost版本.
是否应该丢弃具有未知IPv6扩展头的数据包?
通过检查RFC,我找不到这个问题的答案.IPv6 Essentials一书在第22页上说明:
如果节点需要下一个标头但无法识别Next Header字段中的值,则需要丢弃该数据包并将ICMPv6 Parameter Problem消息发送回数据包源.
我将其读作:除非路径上的所有 IPv6堆栈都知道如何处理标头,否则不会丢弃带有自定义扩展标头的IPv6数据包.或者等效地,如果路径上的单个IPv6设备不知道如何处理自定义标头,则会丢弃该数据包.
这似乎与扩展的一般概念不一致:即使自定义扩展不影响通用IPv6堆栈,我也无法在不升级整个网络的情况下引入新扩展.
networking network-programming network-protocols ipv6 packet
如何在FreeBSD 10上获得基于GCC的C++ 11设置?似乎FreeBSD上最近的GCC版本附带的标准库已被破坏.我已经安装了端口gcc49,然后尝试编译:
#include <string>
int main()
{
auto str = std::to_string(42);
str = std::to_string(42ull);
str = std::to_string(4.2);
str.clear();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
g++49 -v -std=c++11 foo.cc
Using built-in specs.
COLLECT_GCC=g++49
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.2/lto-wrapper
Target: x86_64-portbld-freebsd10.0
Configured with: ./../gcc-4.9-20141022/configure --disable-nls --enable-gnu-indirect-function --libdir=/usr/local/lib/gcc49 --libexecdir=/usr/local/libexec/gcc49 --program-suffix=49 --with-as=/usr/local/bin/as --with-gmp=/usr/local --with-gxx-include-dir=/usr/local/lib/gc
c49/include/c++/ --with-ld=/usr/local/bin/ld --with-pkgversion='FreeBSD Ports Collection' --with-system-zlib --with-ecj-jar=/usr/local/share/java/ecj-4.5.jar --enable-languages=c,c++,objc,fortran,java --prefix=/usr/local --mandir=/usr/local/man --infodir=/usr/local/info/gcc49 --build=x86_64-portbld-freebsd10.0
Thread model: posix
gcc version 4.9.2 20141022 (prerelease) (FreeBSD Ports Collection)
COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/local/libexec/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.2/cc1plus -quiet -v foo.cc -quiet …Run Code Online (Sandbox Code Playgroud) 在BSD Makefile中,是否可以定义一个包罗万象的目标?我正在寻找相当于GNU的GNU:
%:
@echo caught target $@
Run Code Online (Sandbox Code Playgroud)
我希望预处理器拥有足够的魔力来动态定义目标,但无法弄清楚如何这样做.所有局部变量(例如.TARGET,仅在目标内工作但不在全局范围内工作).
c++ ×7
c++11 ×5
boost ×2
networking ×2
boost-asio ×1
bsdmake ×1
c++-chrono ×1
c++14 ×1
clang ×1
crtp ×1
endianness ×1
freebsd ×1
gcc ×1
iostream ×1
ipv6 ×1
libstdc++ ×1
makefile ×1
packet ×1
streambuf ×1
templates ×1