我知道auto之前有一些用法,因为它是变量的默认值(与静态相反) - 请参阅问题
考虑有效的C++ 03代码,其中可能为了不言自明,使用了这个关键字:
auto int foo2 = 8;
Run Code Online (Sandbox Code Playgroud)
它在C++ 03下编译,不能在C++ 11下编译.有没有理由不与C++ 03反向兼容?标准委员会意见的来源是什么,没有使用此关键字?是否有关键字使用情况的统计数据?
BTW我用gcc测试过 - 也许这是一个编译器错误?
我有一个模板课
template< std::size_t Size >
class Buffer
{
....
};
Run Code Online (Sandbox Code Playgroud)
当Size参数为零时,我想阻止此模板的实例化.即为以下内容生成编译器警告.
Buffer< 0 > buf;
Run Code Online (Sandbox Code Playgroud)
但所有其他变种都可行.
Buffer< 10 > buf;
Run Code Online (Sandbox Code Playgroud)
我正在寻找使用boost :: enable_if_c,但我不明白如何让它工作.
- 更新 - 遗憾的是,我无法使用任何c ++ 11功能
我有一个大的头文件(~10000行),由我的控件中的脚本/程序自动生成.
为了避免在我的类的声明中包含此文件,我转发声明我需要的几种类型:
--myclass.h
namespace bl {
class TypeA;
class TypeB;
}
// Other stuff and myclass definition...
Run Code Online (Sandbox Code Playgroud)
现在它证明了TypeA并且TypeB不是类名,而是在自动生成的文件中定义为:
typedef SomeUnspecifiedClassName TypeA;
typedef AnotherUnspecifiedClassName TypeB;
Run Code Online (Sandbox Code Playgroud)
在哪里SomeUnspecifiedClassName我的意思是我不能转发声明这个类型名称,因为它可能会在各种情况下发生变化.
我怎样才能转发声明typedef?(不能使用c ++ 11)
我试图减少并简化一些可怕的嵌套和过度专业的模板化C++代码.为此,我希望能够声明成员类型,该成员类型取决于函数或类已实例化的模板化类型.
获取以下通用类模板生成的模板特化.'a'的类型取决于实例化类型.
template <typename Float> class A;
template <>
class A<double> {
double a;
}
};
template <>
class A<float> {
float a;
}
};
template <>
class A<short> {
float a;
}
};
Run Code Online (Sandbox Code Playgroud)
除了'a'的类型,模板类型到double-> double的类型,float-> float和short-> float之外,这些类是相同的.有没有办法简单地封装这个映射,只允许只写一次类?
我想我想写下面的内容,但我不知道这是否可行.
typedef double Float2<double>;
typedef float Float2<float>;
typedef float Float2<short>;
template <typename Float>
class A {
Float2<Float> a;
}
};
Run Code Online (Sandbox Code Playgroud)
注意我正在使用C++ 03并且不能使用C++ 11来实现此目的(我认为decltype可能在这里使用,但我不确定).
我一直在编写C++编程,我开始怀疑规则使用引用应尽可能应用于任何地方.
与这个相关的SO帖子不同,我对一种不同的东西感兴趣.
根据我的经验,参考/指针混合会混淆你的代码:
std::vector<Foo *> &x = get_from_somewhere(); // OK? reference as return value
some_func_pass_by_ref(x); // OK reference argument and reference variable
some_func_by_pointer(x[4]); // OK pointer arg, pointer value
some_func_pass_elem_by_ref(*x[5]); // BAD: pointer value, reference argument
some_func_that_requires_vec_ptr(&x); // BAD: reference value, pointer argument
Run Code Online (Sandbox Code Playgroud)
一种选择是,以取代&与* const像Foo &用Foo * const
void some_func_by_ref(const std::vector<Foo * const> * const); // BAD: verbose!
Run Code Online (Sandbox Code Playgroud)
这样至少走遍了.和我重写功能头走了,因为所有的参数将指针......在污染代码的价格const,而不是指针运算(主要是&和*).
我想知道在可能的规则下如何 …
我正在尝试调整Martinho Fernandes的示例std::future实现,以便它可以在C++ 03下以Boost 1.40运行,作为一种便宜的,间隙测量,直到我可以访问Boost 1.41或C++ 11本身.
我的适应性并不美观,而且肯定不是最佳的,但我更希望它至少能起作用.但是,根据gcc版本4.4.1 20090725(Red Hat 4.4.1-2),它没有.
这是futures.h:
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <stdexcept>
template <typename T>
class future;
template <typename T>
class promise;
namespace detail {
template <typename T>
struct future_shared_state
{
public:
void wait(boost::mutex& m) const
{
boost::mutex::scoped_lock lock(m, boost::adopt_lock);
while (!(state || error))
available.wait(lock);
}
T& get()
{
if (state)
return *state;
if (error)
throw *error;
throw std::runtime_error("WTF");
}
template <typename U>
void set_value(const U& value) …Run Code Online (Sandbox Code Playgroud) 我读过static_cast在编译时dynamic_cast发生并且在运行时发生,因此比它慢static_cast.A dynamic_cast可以返回null ptr(当使用指针时)或者抛出错误的强制转换异常.我的问题是关于什么reinterpret_cast和const_cast做他们发生在编译时或运行时?我认为解释强制转换是在运行时发生的,因为它的行为类似于dynamic_cast指示强制转换是否成功.我对么 ?const_cast是编译时间吗?
我找到了一些模板化的代码,在某些时候执行以下检查:
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (t < 0)
...
}
Run Code Online (Sandbox Code Playgroud)
代码的概念t是整数类型(有符号或无符号).无论签名如何,代码都可以正常工作,但编译器会发出警告,因为在unsigned整数的情况下,检查将始终为true.
在C++ 03中有没有办法修改代码以摆脱警告而不抑制它?我正在考虑T以某种方式检查签名,不知道它是否可能.
我知道C++ 11,is_signed但我不确定它是如何在C++ 03中实现的.
我有一些const变量,我希望在多个源文件之间共享值.我还希望变量的范围限于命名空间.我不确定最好/正确的方法吗?
我可以使用#define但希望类型安全.
到目前为止,我有以下工作:
File0.h
#pragma once
namespace Namespace1
{
extern const int variable1;
extern const int variable2;
}
Run Code Online (Sandbox Code Playgroud)
File0.cpp
const int Namespace1::variable1 = 10;
const int Namespace1::variable2 = 10;
Run Code Online (Sandbox Code Playgroud)
Source1.cpp
#include "File0.h"
int result1 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)
Source2.cpp
#include "File0.h"
const int result2 = Namespace1::variable1 + Namespace1::variable2;
Run Code Online (Sandbox Code Playgroud)
使用extern我如何知道值何时初始化?
1 ST关断这不是关于如何指向一个恒定方法问题。我想知道如何使我的方法指针恒定。
鉴于:
struct foo {
void func1();
void func2();
};
Run Code Online (Sandbox Code Playgroud)
我可以使用构建方法指针,void (foo::*bar)() = &foo::func1 但是以后可以使用,但bar = &foo.func2我想避免这种情况。
我可以轻松地做到这一点const auto bar = &foo::func1,但是我不确定在c ++ 11之前如何做到这一点。
c++ member-function-pointers function-pointers constants c++03