小编rel*_*xxx的帖子

在LINUX上获取设备输入(鼠标,键盘......)

我正在构建跨平台的游戏引擎,现在我专注于输入系统.

我编写了一个抽象的输入系统,它传递消息并由平台相关模块提供,在单独的线程中运行.

在Windows中,我创建了"仅消息"窗口,该窗口向输入系统提供来自RAWINPUT的消息(转换为独立于平台).

现在我有麻烦想弄清楚如何在基于unix的系统上做类似的事情.有没有方便的方法从内核获取输入(keyup,keydown,mousemove ...)?或者任何其他方式,而不需要显示任何窗口?

编辑

我不希望我的输入系统依赖于我的渲染器.当应用程序焦点改变时,渲染器应该只通知输入...所以我希望输入系统在与渲染器不同的线程上运行.

c++ linux raw-input

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

如何在编译时找出std :: bitset的大小

有没有办法找出一个大小std::bitset

我有

 typedef std::bitset<64> Bitset;
Run Code Online (Sandbox Code Playgroud)

我想知道大小而不创建实例.例如.喜欢Bitset::size

当我看到bitset.h它的来源对我来说是完全不可读的,但即使我找到了这些线条

public:
    enum {_EEN_BITS = _Bits};   
    typedef _Bitset_base<_Bits <= 8 ? 1
        : _Bits <= 16 ? 2
        : _Bits <= 32 ? 4
        : 8> _Mybase;
    typedef typename    // sic
        _Mybase::_Ty _Ty;
Run Code Online (Sandbox Code Playgroud)

我认为可以告诉我,它_Ty可以包含大小,但是当我试着打电话给Bitset::_Ty我时illegal use of this type as an expression

我知道在我输入bitset之前我可以存储大小,但这不是我想要的.

c++

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

正确使用std :: enable_if或如何替换它

这是正确使用std :: enable_if吗?它有效,但它是否正确?

//*.h file

template <typename T>
static typename std::enable_if<std::is_integral<T>::value, T>::type 
randomFrom(const T min, const T max);


template <typename T>
static typename std::enable_if<std::is_floating_point<T>::value, T>::type 
randomFrom(const T min, const T max);
Run Code Online (Sandbox Code Playgroud)

.

//*.inl file

template <typename T>
inline typename std::enable_if<std::is_integral<T>::value, T>::type 
Math::randomFrom(const T min, const T max)
{
    static std::default_random_engine re((unsigned long)time(0));
    std::uniform_int_distribution<T> uni(min, max);
    return static_cast<T>(uni(re));
}

template <typename T>
inline typename std::enable_if<std::is_floating_point<T>::value, T>::type 
Math::randomFrom(const T min, const T max)
{
    static std::default_random_engine re((unsigned long)time(0));
    std::uniform_real_distribution<T> uni(min, max);
    return …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits c++11

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

显式构造函数和static_cast

struct Foo
{
    explicit Foo(int a):m(a){}
    int padd1, m, padd2;
};

void Bar(Foo){}

int main()
{
    Bar(11); // OK, gives error
    auto x = static_cast<Foo>(37);
    x.m;
}
Run Code Online (Sandbox Code Playgroud)

即使构造函数被标记,static_cast构造Foo对象也没关系explicit吗?

它适用于MSVC2013和GCC http://ideone.com/dMS5kB

c++ explicit static-cast

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

在另一个命名空间内使用`namespace`的范围

我知道我把using指令的范围限制在一个块或一个函数放在里面.然后它将仅适用于该范围.但是如果块是a,namespace它通过相同命名空间的所有块显然适用.那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)

namespace N1
{
    struct Foo{};
}

namespace N2
{
    using namespace N1;
    Foo f;
}

namespace N2
{
    Foo f2;
}

int main()
{
    N2::f2;
}
Run Code Online (Sandbox Code Playgroud)

我本来应该Foo f2给出一个错误,因为Foo应该是未知的.所以我真正的问题是,using对于同一名称空间的所有块,名称空间块中的语句是否有效?

当所有cpp文件被包含在一起编译时会导致问题,因为它会污染其他cpp文件,这些文件不应该包含其他命名空间(放置using指令的那个).因此,实际上它可能会导致不良冲突.

c++ scope using-directives

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

如何将模板类的内部类分成其他文件

我想要做:

typedef MyTemplateClass<Type01, Type02> TClass;
TClass t;
TClass::InnerClass i;
i.test();
Run Code Online (Sandbox Code Playgroud)

我认为解决方案可能是:

template <typename A, typename B>
class MyTemplateClass
{
public:
    class InnerClass
    {
        //here I can do stuff with A and B
        A test() { return 0; }
    };

    friend class InnerClass;
};
Run Code Online (Sandbox Code Playgroud)

但我希望在头文件底部包含单独的*.inl文件中有ma模板

如何在其他文件中定义此类行为?

当我做的时候

//file.inl
class InnerClass
{
    //here I can do stuff with A and B
    A test() { return 0; }
};
Run Code Online (Sandbox Code Playgroud)

A和B未定义.

template <typename A, typename B>
class InnerClass
{
...
};
Run Code Online (Sandbox Code Playgroud)

使我的方法模板独立于MyTemplateClass类型...

再一句话:如何在提供的其他文件中创建MyTemplateClass的InnerClass …

c++ templates inner-classes

3
推荐指数
1
解决办法
1639
查看次数

生成0到10之间的随机数

如何生成0到10之间的随机数?我可以为这个随机数生成一个样本吗?

c++ random math

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

使用std :: ref参数调用函数std :: bind(ed)

#include <functional>
#include <iostream>

struct Test
{
    void fnc(int & a) { ++a; }
};

int main ()
{
    typedef std::function<void(int)> Func;

    int i = 0;
    Test t;
    Func f = std::bind(&Test::fnc, &t, std::ref(i));
    //f(); //error C2064: term does not evaluate to a function taking 0 arguments
    f(37); //Here I am forced to pass evidently unused int
    std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)

我使用它吗?

是否真的有必要传递一些随机的int?

如果是这样,为什么呢?是因为模板的魔力是有限的,我实际上必须将int传递给函数服用int OR是出于某种目的设计的吗?(例如,强迫用户不要忘记函数声明的样子如何?)

我使用vs2012

c++ c++11

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

重载 wstring 和 wchar_t * 中的类似转换

我有以下代码:

inline bool match(const std::wstring & text1, const std::wstring & text2)
{
    return match(text1.c_str(), text2.c_str());
}

inline bool match(const std::wstring & text1, const wchar_t * text2)
{
    return match(text1.c_str(), text2);
}

inline bool match(const wchar_t * text1, const std::wstring & text2)
{
    return match(text1, text2.c_str());
}

inline bool match(const wchar_t * text1, const wchar_t * text2)
{
    return !wcscmp(text1, text2);
}
Run Code Online (Sandbox Code Playgroud)

我得到:

error C2666: 'match' : 3 overloads have similar conversions
1>   could be 'bool match(const wchar_t *,const std::wstring &)' …
Run Code Online (Sandbox Code Playgroud)

c++ overloading wchar-t wstring implicit-conversion

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

我可以依赖模板类型吗?

我正在通过示例书查看来自Game AI的工作代码,并且有一部分我不明白.

template <class node_type, class edge_type>   
class SparseGraph                                 
{ ... };
Run Code Online (Sandbox Code Playgroud)

int SparseGraph<node_type, edge_type>::AddNode(node_type node)
{
  if (node.Index() < (int)m_Nodes.size())
...
}    
Run Code Online (Sandbox Code Playgroud)

怎么node.Index()称呼?

还有课

class GraphNode
{  
public:
...   
  int  Index()const{return m_iIndex;}
....
};   
Run Code Online (Sandbox Code Playgroud)

并使用此类创建图形

typedef SparseGraph<GraphNode, GraphEdge> NavGraph;
NavGraph * m_pGraph;
Run Code Online (Sandbox Code Playgroud)

让我明白了什么node.Index()做的,但我怎么能叫node.Index()虽然没有保证node_typeGraphNode.

如果node_type不是GraphNode

希望你理解我的问题.

c++ templates

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

强制编译器生成全类模板

我如何强制编译,生成全类模板?不只是我使用的方法?我确信我在模板完整指南中读到了它,但我找不到它.这是一线声明.

我无法向谷歌提出正确的问题.

谢谢!

c++ templates

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

如何结束模板层?

当有:

template <typename Super>
class Whatever : public Super
{
    ...
};
Run Code Online (Sandbox Code Playgroud)

是否有可能在Whatever没有衍生出某些东西的情况下创造课程?

这是较轻的版本吗?

struct BlankType{};

Whatever<BlankType> w;
Run Code Online (Sandbox Code Playgroud)

////////////////////////////////////////

一些背景:

我将我的代码组合成Whatever上面的模板层.所以我可以这样做:

typedef Whatever<Whenever<Wherever<>>>> MyCombinedType
Run Code Online (Sandbox Code Playgroud)

实际上我不能.我要做

typedef Whatever<Whenever<Wherever<BlankType>>>> MyCombinedType
Run Code Online (Sandbox Code Playgroud)

并且类型也变为BlankType.我无法做出Wherever"不可剥夺的",因为当我做的时候

typedef Whatever<Whenever<>>> MyCombinedType
Run Code Online (Sandbox Code Playgroud)

问题会再次出现......

c++ templates

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

使用括号创建std :: vector以获取默认大小

#include <iostream>
#include <vector>

int main()
{
    static const unsigned TOTAL = 4;

    std::vector<int> v[TOTAL];

    v[2].push_back(37);

    //std::cout << v.size(); error 
    std::cout << v[0].size();
    std::cout << v[2].size();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否可以std::vector像上面的代码一样使用括号进行instatnitate ?

MSVS和ideone编译得很好,但是向量混乱了(参见错误行).

我知道我可以使用resize,但这里发生了什么?

c++ vector

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