小编ved*_*ity的帖子

将Boost.Proto语法与类型匹配

我正在尝试在Boost.Proto中创建一个匹配矢量类型的语法,但是当我给它一个该类型的终端时,它与语法不匹配.类型定义如下所示:

template <typename T, unsigned D>
struct vector
{
    typedef T scalar;
    enum { size = D };

    scalar& operator[](unsigned i)
    {
        return m_components[i];
    }

    scalar const& operator[](unsigned i) const
    {
        return m_components[i];
    }

private:
    scalar m_components[size];
};
Run Code Online (Sandbox Code Playgroud)

我试图匹配的语法看起来像这样:

namespace proto = boost::proto;
using proto::_;
using proto::N;

struct test:
    proto::terminal<vector<_, N> >
{};
Run Code Online (Sandbox Code Playgroud)

比赛失败:

int main ()
{
    BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float, 2> >::type, test>));
}
Run Code Online (Sandbox Code Playgroud)

如何制作与特定类型匹配的语法?

编辑:

似乎proto :: _和proto :: N在自定义类型中不用作通配符.代码用这个语法编译(matches断言传递):

struct test:
    proto::terminal<vector<float, 2> >
{};
Run Code Online (Sandbox Code Playgroud)

但是当其中任何一个通配符属于该类型时,它都不起作用:

struct …
Run Code Online (Sandbox Code Playgroud)

c++ boost expression-templates boost-proto

10
推荐指数
2
解决办法
752
查看次数

Exposé布局算法

我制作的东西与Mac OS X在Exposé中的窗口类似.它适应项目的纵横比和可用区域的纵横比.

基本上,可用区域分为行和列.项目放在每个单元格(行和列的交集)中.width / height尽管电池的纵横比,物品必须保持其纵横比(此处).单元格数必须大于或等于项目数.在单元格数大于项目数的情况下,最后一行将不会被充分利用.目标是尽可能多地利用物品的可用区域.我很确定每个单元格的纵横比与项目的纵横比越接近越好.

当可用区域的宽高比等于项目的宽高比时,以下情况很有效:

rows    := round(sqrt(count));
columns := ceiling(sqrt(count));
Run Code Online (Sandbox Code Playgroud)

其中:count是项目数量; round(x)x到最接近的整数值,从零取整的情况下中途离开; 并ceiling(x)返回不小于的最小整数值x.

我知道Compiz使用以下类似的算法,但它没有考虑项目和可用区域的宽高比:

rows    := floor(sqrt(count + 1));
columns := ceiling(count / rows);
Run Code Online (Sandbox Code Playgroud)

其中:floor(x)返回不大于的最大整数值x.

我把以下O(n)算法放在一起,它测试行和列的每个组合并寻找最佳拟合,但肯定有一个O(1)算法,因为它产生与第一个(O(1))完全相同的结果当项目和可用区域的纵横比相同时的算法:

fit (itemCount, itemRatio, availableRatio)
{
    bestRows := infinity;
    bestColumns := infinity;
    bestDiff := infinity;

    for (rows := 1; rows <= count; rows += 1)
    {
        columns := ceiling(count / rows);

        cellWidth  := …
Run Code Online (Sandbox Code Playgroud)

algorithm math layout user-interface

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

模板函数的参数没有进行任何隐式转换

由于某些奇怪的原因,我无法在这一段代码中获取模板参数以隐式转换为兼容类型.

#include <type_traits>

template <typename T, unsigned D>
struct vec;

template <>
struct vec<float, 2> {
    typedef float scalar;
    static constexpr unsigned dimension = 2;

    float x, y;
    float&       operator[] (unsigned i)       { return (&x)[i]; }
    float const& operator[] (unsigned i) const { return (&x)[i]; }
};


template <typename L, typename R>
struct add;

template <typename L, typename R, unsigned D>
struct add<vec<L, D>, vec<R, D>> {
    typedef vec<L, D> left_type;
    typedef vec<R, D> right_type;
    typedef vec<typename std::common_type<L, R>::type, D> …
Run Code Online (Sandbox Code Playgroud)

c++ templates expression-templates template-meta-programming c++11

4
推荐指数
1
解决办法
318
查看次数