小编mav*_*vam的帖子

狮身人面像添加图像或图形的链接

我在Sphinx尝试一些相当基本的东西.我有一些图像,但我更喜欢让它们保持很小,我想让用户点击它们来获得更大的图像.我没有找到一种语法结合image:figure:ref:link:.

.. image:: _static/my_image_small.png
Run Code Online (Sandbox Code Playgroud)

我在同一个文件夹中my_image_large.png.

如果您想出一个解决方案,那么较大的图像应该是一个带有显式链接的文件,还是我创建一个带有附加image:标记的reSt文件?另一种方法是使用reSt文件中的图像大小,但后来我仍然不知道如何创建从小图像到大图像的链接.

感谢你们对我的帮助.

python-sphinx

13
推荐指数
1
解决办法
3835
查看次数

如何有效地使用Boost的intrusive_ptr?

手动Unref

我对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)

c++ boost memory-management smart-pointers c++11

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

在CRTP中推断返回类型的模板化成员函数

是否可以推断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++ templates crtp c++11 c++14

11
推荐指数
1
解决办法
894
查看次数

Clang问题:施工时的隐式类型转换

概要

我正在努力使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)

c++ clang c++11

10
推荐指数
1
解决办法
1093
查看次数

在streambuffers之间进行数据块级复制

我想在实例之间有效地复制数据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 << &in;
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的块级成员函数,sputnsgetn不是每个字符的传输.标准库是否提供了这样的算法,还是我必须自己编写?

c++ iostream streambuf

10
推荐指数
1
解决办法
126
查看次数

是否有std :: streambuf版本将主机转换为网络字节顺序?

是否存在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>>执行转换.

c++ networking boost endianness boost-asio

9
推荐指数
1
解决办法
967
查看次数

如何将分数纪元时间戳(double)转换为std :: chrono :: time_point?

我有一个小数纪元时间戳,表示为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版本.

c++ boost-date-time unix-timestamp c++11 c++-chrono

8
推荐指数
1
解决办法
3747
查看次数

处理具有未知IPv6扩展头的数据包

是否应该丢弃具有未知IPv6扩展头的数据包?

细节

通过检查RFC,我找不到这个问题的答案.IPv6 Essentials一书在第22页上说明:

如果节点需要下一个标头但无法识别Next Header字段中的值,则需要丢弃该数据包并将ICMPv6 Parameter Problem消息发送回数据包源.

我将其读作:除非路径上的所有 IPv6堆栈知道如何处理标头,否则不会丢弃带有自定义扩展标头的IPv6数据包.或者等效地,如果路径上的单个IPv6设备不知道如何处理自定义标头,则会丢弃该数据包.

这似乎与扩展的一般概念不一致:即使自定义扩展不影响通用IPv6堆栈,我也无法在不升级整个网络的情况下引入新扩展.

networking network-programming network-protocols ipv6 packet

7
推荐指数
1
解决办法
2156
查看次数

让GCC在C++ 11模式下工作在FreeBSD上

如何在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)

c++ gcc freebsd libstdc++ c++11

6
推荐指数
1
解决办法
2027
查看次数

使用BSD制作Catchall目标

在BSD Makefile中,是否可以定义一个包罗万象的目标?我正在寻找相当于GNU的GNU:

%:
    @echo caught target $@
Run Code Online (Sandbox Code Playgroud)

我希望预处理器拥有足够的魔力来动态定义目标,但无法弄清楚如何这样做.所有局部变量(例如.TARGET,仅目标工作但不在全局范围内工作).

makefile bsdmake

6
推荐指数
1
解决办法
1389
查看次数