类模板::std::numeric_limits<T>只能为类型实例化,类型T可以是函数的返回值,因为它总是定义成员函数,如static constexpr T min() noexcept { return T(); }(更多信息请参见http://www.cplusplus.com/reference/limits/numeric_limits/) c ++ 03或c ++ 11中的特殊版本.
如果T是,即int[2]实例化将立即导致编译时错误,因为int[2]不能是函数的返回值.
::std::numeric_limits使用安全版本进行包装很容易 - 如果确定实例化::std::numeric_limits是否安全的方法是已知的.这是必要的,因为如果可能的话,应该可以访问有问题的功能.
显而易见(显然是错误的)测试方法::std::numeric_limits<T>::is_specialised不起作用,因为它需要实例化有问题的类模板.
有没有办法测试实例化的安全性,最好不要列举所有已知的坏类型?甚至可能是确定任何类模板实例化是否安全的一般技术?
根据这个非常高度推崇的答案,迭代一组擦除一些元素的规范方法如下:
for (it = mySet.begin(); it != mySet.end(); ) {
if (conditionToDelete(*it)) {
mySet.erase(it++);
}
else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这是C++ 03设置擦除不返回迭代器的结果.否则一个人就可以写了it = mySet.erase(it);很明显,一个人可以写
itToDelete = it++;
mySet.erase(itToDelete);
Run Code Online (Sandbox Code Playgroud)
这个问题不是关于如何在迭代时删除元素.问题是为什么以下行显然不会导致未定义的行为.
mySet.erase(it++);
Run Code Online (Sandbox Code Playgroud)
起初我确信这必须是UB,因为我在考虑后增量方面做错了.这是一种常见(但错误的)方式,将预增量视为在评估的其余部分之前发生,并且后增量发生在AFTER之后.当然,这是错误的.后增量和前增量都有增加变量的副作用.不同之处在于这些表达式的价值.
也就是说,据我所知,C++标准(至少是C++ 03标准)没有明确说明何时会发生后增量的副作用.因此,除非我们保证如果作为后增量表达式的函数参数在进入函数体之前会产生副作用,那么这不应该是UB吗?究竟是什么(标准方面),如果有的话,禁止在迭代器在函数体内失效后发生的++副作用?
标准的行情非常受欢迎.
为了一个参数,让我们假设set的迭代器是一个内置类型,这实际上是operator ++,而不是重载的operator-function
是否可以检查(在C++中)类型是否可转换(隐式或显式)?是否存在某些内容std或是否可以编写类似C#(C#同一问题)的函数?
我想对类型执行此检查而不是类型的实例.
我不确定C++中的类型系统.有没有类似TypeC#或Java 的类?typeid(int)是我找到的最近的.我可以将类型存储到变量中吗?更贴心的阅读提示将不胜感激.
例如:
bool isCastable(false);
bool withoutLoss(true);
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //false
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //false
isCastable = isCastableFromTo(typeid(string), typeid(int), withoutLoss); //false
withoutLoss = false;
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //true
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //true
isCastable = …Run Code Online (Sandbox Code Playgroud) 在lib Bullet中定义了一种类型:
typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
Run Code Online (Sandbox Code Playgroud)
在那里的文档中提供了一个使用示例(第23页):
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) {
// Do your collision logic here
// Only dispatch the Bullet collision information if you want the physics to continue
dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo);
}
Run Code Online (Sandbox Code Playgroud)
我将这个示例代码复制到我的类defention中,所以我的类得到了这个函数,我将能够做这样的演员:
dispatcher->setNearCallback(boost::bind(&BulletAPIWrapper::MyNearCallback, this, _1, _2, _3));
Run Code Online (Sandbox Code Playgroud)
而不是像dispatcher->setNearCallback(MyNearCallback);Bullet教程那样的C.
然而我的VS2010 sp1给了我一个错误:
Error 44 error C2664: 'btCollisionDispatcher::setNearCallback' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to 'btNearCallback'
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何将boost :: bind转换为这样的typedef?
是否有可能具有静态类函数(或至少是全局函数):
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& …Run Code Online (Sandbox Code Playgroud) 首先,请注意我使用的是C++ 03(而C++ 11不是一个选项).我正在使用boost概念来检查某个类是否可以默认构造:
BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<my_class>));
Run Code Online (Sandbox Code Playgroud)
然而,对于一些其他类我想断言类型并没有默认构造函数.有办法做到这一点吗?
更新:对所有那些标记问题重复或已经回答的超级专家没有阅读它:我在第一段中说明我已经使用boost概念检查类是默认构造的(这是假设的问题)是重复的).我还明确声明我不能使用C++ 11,因此我无法使用type_traits.所以,可能有人请点我到特定部分我的问题是"已经回答了"?因为我还没有找到它.
我这里有一个通用状态机的专有实现,它使用std::tr1::tuple一个转换表作为转换表:
template<State StartState, Event TriggerEvent, State TargetState>
struct transition {...};
typedef std::tr1::tuple< transition< ready , run , running >
, transition< running , terminate, terminating >
, transition< terminating, finish , terminated >
> transition_table;
Run Code Online (Sandbox Code Playgroud)
有一个功能
template<typename Transitions>
State find_next_state( State current
, Event event
, const Transitions& transition_table );
Run Code Online (Sandbox Code Playgroud)
在给定当前状态和事件的情况下查找转换表中的下一个状态.
这一切都很好,除了这个平台的tuple实现不支持10个以上的项目.这似乎也是如此boost::tuple,所以我试图改为使用boost::fusion::vector.但似乎融合find_if仅采用"一元MPL Lambda表达式 " - 我想这只能在编译时使用.
所以鉴于上述情况,我该如何实施find_next_state()?
注意:
这是一个专有的嵌入式平台,仅提供GCC 4.1.2,因此我们坚持使用C++ 03 + TR1.
C++的STL优先级队列有一个void pop()方法和一个const ref top()方法.因此,如果要将元素移出队列,则必须执行以下操作:
T moved = std::move(const_cast<T&>(myQueue.top())));
myQeue.pop();
Run Code Online (Sandbox Code Playgroud)
这有效地将顶部强制转换为常量,以便可以移动(而不是复制).我不喜欢这段代码,因为强制移动可能会使优先级队列的不变量无效,这不应该因为pop而烦恼,但事情可能会出错.
有没有更好的方法来完成弹出/移动?为什么没有T && top_and_pop()函数?
中途我可以通过更换一个有效的C++程序03 std::vector::push_back用emplace_back与C++编译器11编译呢?从阅读emplace_back参考我收集它不应该发生,但我承认我没有完全得到右值参考.
std::vector::push_back(constT& value)
Run Code Online (Sandbox Code Playgroud)
根据此要求类型T为CopyInsertable .
但是,除非我提供公共赋值运算符,否则使用failes(clang,GCC,Visual;两者都没有c ++ 11)编译以下程序.
#include <vector>
class A {
A& operator= (const A& rhs); //private !!
};
int main() {
std::vector<A> v;
A a;
v.push_back(a);
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要提供这个赋值运算符,我的印象是复制结构就足够了.
PS我无法在标准中找到这个定义的位置,所以如果你能指出参考,我将非常感激
考虑一下:
#include <iostream>
#include <map>
#include <string>
#include <boost/assign/list_of.hpp>
using boost::assign::map_list_of;
const std::map<int, std::map<int, char> > test = map_list_of
(100, map_list_of
(1, 'a')
(2, 'b')
)
(101, map_list_of
(1, 'c')
(2, 'd')
)
;
int main()
{
std::cout << test.find(101)->second.find(2)->second << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我希望结果是一个程序,在执行时输出d.
相反,我明白了:
$ clang++ -std=c++03 -O2 -Wall -pedantic -pthread main.cpp
In file included from main.cpp:1:
In file included from /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/iostream:39:
In file included from /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/ostream:38:
In file included from /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/ios:40:
In file included …Run Code Online (Sandbox Code Playgroud) c++ ×10
c++03 ×10
boost ×3
c++11 ×3
templates ×2
vector ×2
boost-bind ×1
boost-fusion ×1
casting ×1
iterator ×1
side-effects ×1
stl ×1