我读到的与这些实用程序有关的大多数帖子通常都建议使用其他方法来获得相同的效果.例如,通常提到这些工具的问题至少有一个答案包含以下一些内容:
假设开发人员......
所以我的问题是:
我一直在努力尝试(逐步)修改文档中的示例代码,但没有太大的不同,我没有得到我期望的行为.具体来说,"if"语句在(我的意图是)它应该传递时失败(有一个"else"但是在调试期间删除了部分解析器).赋值语句工作正常.我有一个"while"语句,它与"if"语句有同样的问题,所以我相信如果我能得到帮助来弄清楚为什么一个不工作它应该很容易让另一个去.它必须是一种微妙的,因为这几乎是逐字逐句的,其中一个例子.
#include <iostream>
#include <fstream>
#include <string>
#define BOOST_SPIRIT_DEBUG
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_statement.hpp>
#include <boost/spirit/include/phoenix_container.hpp>
namespace qi = boost::spirit::qi;
namespace lex = boost::spirit::lex;
inline std::string read_from_file( const char* infile )
{
std::ifstream instream( infile );
if( !instream.is_open() )
{
std::cerr << "Could not open file: \"" << infile << "\"" << std::endl;
exit( -1 );
}
instream.unsetf( std::ios::skipws );
return( std::string(
std::istreambuf_iterator< char >( instream.rdbuf() ),
std::istreambuf_iterator< char >()
) );
}
template< typename …Run Code Online (Sandbox Code Playgroud) 是否可以编写一个接受类型并返回(相关)类型的函数.例如,一个函数采用一个名为"RandomVariable"的类型并返回一个名为"RandomVariableCovariance"的类型.我猜一般来说问题是类型名是否可以是参数或返回类型.C++ 0x很好.
我正在开发一个有两个不同最终用户的库,其中一个使用gcc 4.5.3而另一个只是移动到gcc 4.6.3.该库使用新的C++ 11智能指针(特别是unique_ptr)并在gcc 4.5.3上编译良好.但是,在这两个版本之间,gcc开始支持nullptr,因此unique_ptr的API更改为更接近标准.现在这样做,以下代码从精细到模糊
unique_ptr up( new int( 30 ) );
...
if( up == 0 ) // ambiguous call now to unique_ptr(int) for 0
Run Code Online (Sandbox Code Playgroud)
是否有一个干净的(即,下一句)方式来改变上面的if语句,以便它可以使用和不使用nullptr?如果可能的话,我想避免配置检查,然后像下面的宏(我认为可行)
#if defined NULLPOINTER_AVAILABLE
#define NULLPTR (nullptr)
#else
#define NULLPTR (0)
#endif
Run Code Online (Sandbox Code Playgroud)
或者这是获得我正在寻找的行为的唯一方法吗?
不确定如何用短语来表达这个问题或搜索什么,如果这与其他问题相同,请关闭并重定向到相应的问题.
假设
template<typename Type, int Size> class vector
{
Type data[Size];
}
Run Code Online (Sandbox Code Playgroud)
是否可以替换一个构造函数,该构造函数在模板特化中使用大小数量的参数
template<typename Type> class vector3<Type,3>
{
Type data[3];
public:
vector3( Type, Type, Type );
}
Run Code Online (Sandbox Code Playgroud)
在非专业模板类中的东西?就像一个"varargs构造函数",它生成一个构造函数,其大小为类型为Type的参数?
涉及C++ 0x功能的解决方案很好.
如果T建造成本高,我想知道我是否支付以下情况下的默认施工(我想我这样做)
std::function< T() > make_t;
std::vector< T > t( 100000 );
std::generate( t.begin(), t.end(), make_T );
Run Code Online (Sandbox Code Playgroud)
如果我必须付钱,我可以避免吗?我想写点类似的东西
std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.end(), make_T );
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它不会将t.end()移动到保留的末尾.以下是安全/可取/正确的吗?
std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.begin() + 100000, make_T );
Run Code Online (Sandbox Code Playgroud)
我还以为我可以使用back_inserter,但接口适合我所拥有的(我有一个函数,每次访问时都会生成一个新的T对象,而不是一对迭代器到一个范围).
C++ 0x解决方案优于C++ 03解决方案(即,如果有更好的方法,那么利用新标准的解决方案)优先选择需要使用boost的解决方案.
我(基本上)在野外遇到以下情况
x = x = 5;
Run Code Online (Sandbox Code Playgroud)
显然在早期版本的gcc下完全编译(在gcc 4.5.1下生成警告).据我所知,警告是由-Wsequence-point生成的.所以我的问题是这是否违反了关于在序列点之间操纵变量的标准中的措辞(即,它是根据规范的未定义行为)或者这是gcc误报(即,它是根据规范定义的行为)?关于序列点的措辞有点难以理解.
我说的基本上是因为我实际遇到的(在更大的表达中)是
x[0][0] = x[0][0] = 5;
Run Code Online (Sandbox Code Playgroud)
但我认为这不是警告的重要因素(请纠正我,如果这是重点,而不是我认为是问题的关键).
我正在尝试为函数调用创建替代名称,numberedFunction如下所示具有某些值
template< typename T >
class X
{
public:
X() : single( std::bind( &X::numberedFunction, *this, 1 ) ),
halfDozen( std::bind( &X::numberedFunction, *this, 6 ) )
{ ... }
T numberedFunction( unsigned int i ) { ... }
const std::function< T() >& single;
const std::function< T() >& halfDozen;
};
Run Code Online (Sandbox Code Playgroud)
但是这段代码不正确(当我尝试使用任何特别命名的函数时会出现段错误).使用this我在初始化列表中的方式是否存在问题(例如,当我在那里访问它时,这是不是保证良好的形式)?别的(显而易见的)?有没有更好的方法来做我想做的事情(我觉得几乎肯定是)?
我得到的错误说fill_n下面的行试图使用已删除的复制构造函数:为什么它不尝试使用移动构造函数?我尝试将它包装在一个std::move但没有帮助.
std::vector< std::thread > workers;
workers.reserve( 10 );
std::fill_n( std::back_inserter( workers ), 10, std::thread( []{ std::cout << "thread\n"; } ) );
Run Code Online (Sandbox Code Playgroud)
但是,如果我将fill_n行更改为
for( int i = 0; i < 10; ++i )
{
workers.push_back( std::thread( []{ std::cout << "thread\n"; } ) );
}
Run Code Online (Sandbox Code Playgroud)
工作正常.我认为这些基本上与我之前从一个到另一个的变化相同,之前有些相似的代码.
c++ ×8
c++11 ×7
boost ×2
gcc ×2
boost-spirit ×1
coding-style ×1
flex-lexer ×1
g++ ×1
gcc-warning ×1
nullptr ×1
oop ×1
parsing ×1
templates ×1
unique-ptr ×1
yacc ×1