我正在构建跨平台的游戏引擎,现在我专注于输入系统.
我编写了一个抽象的输入系统,它传递消息并由平台相关模块提供,在单独的线程中运行.
在Windows中,我创建了"仅消息"窗口,该窗口向输入系统提供来自RAWINPUT的消息(转换为独立于平台).
现在我有麻烦想弄清楚如何在基于unix的系统上做类似的事情.有没有方便的方法从内核获取输入(keyup,keydown,mousemove ...)?或者任何其他方式,而不需要显示任何窗口?
编辑
我不希望我的输入系统依赖于我的渲染器.当应用程序焦点改变时,渲染器应该只通知输入...所以我希望输入系统在与渲染器不同的线程上运行.
有没有办法找出一个大小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之前我可以存储大小,但这不是我想要的.
这是正确使用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) 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
我知道我把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指令的那个).因此,实际上它可能会导致不良冲突.
我想要做:
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 …
#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
我有以下代码:
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) 我正在通过示例书查看来自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_type的GraphNode.
如果node_type不是GraphNode?
希望你理解我的问题.
我如何强制编译,生成全类模板?不只是我使用的方法?我确信我在模板完整指南中读到了它,但我找不到它.这是一线声明.
我无法向谷歌提出正确的问题.
谢谢!
当有:
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)
问题会再次出现......
#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++ ×13
templates ×4
c++11 ×2
explicit ×1
linux ×1
math ×1
overloading ×1
random ×1
raw-input ×1
scope ×1
static-cast ×1
type-traits ×1
vector ×1
wchar-t ×1
wstring ×1