假设您有一系列类型无关的类通过返回值的给定方法实现一个通用概念:
class A { public: int val() const { ... } };
class B { public: int val() const { ... } };
Run Code Online (Sandbox Code Playgroud)
假设您需要一个通用的自由函数,它T为任何未实现该val方法的类型返回一个常规值,或者val为所有具有一个类型的类型调用该方法:
template<class T> int val_of(const T& t) { return 0; }
template<class T> int val_of(const T& t) { return t.val(); }
Run Code Online (Sandbox Code Playgroud)
考虑A和B只是样本:您不知道将实现val多少类型,以及将不存在多少类型(因此显式特化不会扩展).
有没有一种基于C++标准的简单方法来静态选择val_of版本?
我正想着一个std::conditional或者std::enable_if,但我没有找到一种表达条件的简单方法.
C++ 11附带了一组PRNG.
在什么情况下应该选择一个而不是另一个?它们有什么优点,缺点等等.
假设我们有一个双参数化模板
template<class A, class B>
class Class { .... };
Run Code Online (Sandbox Code Playgroud)
并且特定A和特定的特殊化B
template<class B> class Class<A1,B> { .... };
template<class A> class Class<A,B1> { .... };
Run Code Online (Sandbox Code Playgroud)
现在,当我必须实例化Class<A1,B1>编译器时,由于它找到<A,B1>并且<A1,B>同样可用,所以会抱怨模糊性.
当然可以通过添加特化来消除问题<A1,B1>,但是在我的上下文中 - 它将是相同的<A1,B>.
有没有办法消除歧义而不重复整个<A1,B>完整的代码?
我想知道如何在C++中接受键盘和鼠标输入,使用Visual Studio 2010,Windows 7 32位.
--EDIT:我忘了提到我需要键盘/鼠标输入而不会中断程序的流程.像听众一样.我不想暂停程序并要求输入,然后让用户输入并按Enter键.我正在寻找的更像是:
如果用户按下W,S,A,D - >会发生一些事情.
或者:如果用户按下leftmouse按钮 - >发生了一些事情.
我必须提到,我对整个编程仍然很陌生.我知道基本的OOP编程,但就是这样.我绝对相信这会涉及我还不知道的事情,我不介意,我只是要求你彻底解释它,并可能举一个例子,所以我知道如何使用它.
谢谢.
假设我们有一个嵌入另一个参数的类,它必须支持复制和移动.让我们假设 - 在某些情况下 - 需要以某种方式获得内在价值.
一种典型的方法可以是这样的:
template<class T>
class wrapper
{
public:
wrapper() :val() {}
wrapper(T s) :val(std::move(s)) {}
wrapper(const wrapper& s) :val(s.val) {}
wrapper(wrapper&& s) :val(std::move(s.val)) {}
wrapper& operator=(wrapper s) { val = std::move(s.val); return *this; }
T value() const { return val; }
private:
T val;
};
Run Code Online (Sandbox Code Playgroud)
这不是唯一的方法,可能没有必要说明复制和移动,但让它们成为现实.
重点是另一个:假设T-in ceratin实例 - 本身就是一个复制/可移动的类.当然,wrapper::value()返回T的副本.
现在假设返回的T必须作为参数进入另一个调用,并且包含的包装器是临时的.
更简单的模拟是
calledfn(wrapper<T>(someT).value());
Run Code Online (Sandbox Code Playgroud)
再说一次:以这种方式完成是无能为力的,但更复杂的情况需要这个微不足道的工作.
从理论上讲,我们可以承认移开val从其临时包装给它的调用者,但是......什么签名应该有value()方法,这样势必时wrapper<T>是暂时的,但没有绑定时,它不是暂时的,为此value() const应首选?