我最近开始将大量现有的C++应用程序代码移植到C++ 11,现在我转换为新的智能指针std :: unique_ptr和std :: shared_ptr,我有一个关于自定义删除的具体问题.我想添加一个lambda记录器来查看我的删除被调用的位置但是我无法获得要编译的数组特化版本.建议将非常感谢.
我已经白白被搜索用于阵列专业化一个定制删除的一个例子的unique_ptr为VC++ 10或GCC 4.5.2+.我想在lambda中调用删除器时打印一条日志消息 - 主要是为了确保我认为超出范围的所有指针都这样做.这可能是专业化的阵列版本吗?我可以使用非数组版本,如果我将外部结构"MyArrayDeleter"作为第二个参数传递,我也可以使用数组特化.还有一件事,是否有可能删除丑陋的std :: function,因为我认为我可以让lambda签名数字出来.
struct MySimpleDeleter {
void operator()(int* ptr) const {
printf("Deleting int pointer!\n");
delete ptr;
}
};
struct MyArrayDeleter {
void operator()(int* ptr) const {
printf("Deleting Array[]!\n");
delete [] ptr;
}
};
{
// example 1 - calls MySimpleDeleter where delete simple pointer is called
std::unique_ptr<int, MySimpleDeleter> ptr1(new int(5));
// example 2 - correctly calls MyArrayDeleter where …Run Code Online (Sandbox Code Playgroud) 我试图确定各种C++成员函数的返回类型.我知道decltype和std :: declval可用于执行此操作,但我遇到语法问题并找到有用的示例.在TestCBClass下面显示了包含一个混合物静态和正常成员函数哑类的一个例子-具有不与参数和返回值.根据所讨论的方法,我希望能够从各种方法中声明返回类型的向量.
在我的应用程序中,这些方法是回调std::async,我需要一个向量std::future<return types>.我尝试了各种声明,例如decltype(std::declval(TestCBClass::testStaticMethod))(我不确定我是否需要&在方法名称之前使用).这种语法不正确 - 当然它不能编译,但我认为它应该使用的方法.
class TestCBClass {
public:
TestCBClass(const int& rValue = 1)
: mValue(rValue) {
std::cout << "~TestCBClass()" << std::endl;
}
virtual ~TestCBClass() {
std::cout << "~TestCBClass()" << std::endl;
}
void testCBEmpty(void) {
std::cout << "testCBEmpty()" << std::endl;
}
int testCBArgRet(const int& rArg) {
std::cout << "testCBArgRet(" << rArg << ")" << std::endl;
mValue = rArg;
}
static void testCBEmptyStatic(void) {
std::cout << "testCBEmptyStatic()" << std::endl; …Run Code Online (Sandbox Code Playgroud) 我一直在将我从Java写过的应用程序移植到C++.我很快意识到的一件事是,Java丰富的Enum(在Java 5中引入)远远优于C++中提供的那些.C++ 0x,以及后来的C++ 11''强类型枚举'(又名枚举类)仍然没有提供Java Enums提供的丰富性,我找不到任何可以在这里模拟这个工具的东西.
我开始尝试模拟一些功能作为类,我希望有一些帮助来实现这一点,可能使用模板(如果合适的话)(似乎应该有更通用的方法来实现它).你会看到,通过一个字符串名来查找特定枚举的能力是相当冗长实现- (这是Java ENUM的的仿真的valueOf(字符串str)方法-它的作品-但我相信,这是远远没有达到最佳我实现Enum实例的方式是使用类中的静态const实例 - 我在Stack Overflow上发现了这个 - 但我不记得究竟在哪里 - 抱歉.
仅供参考,该应用程序是一个NMEA字符串解析器,这里有一些更有趣的Enum类:
这是标题
#ifndef _NMEASentence_h_
#define _NMEASentence_h_
// SYSTEM INCLUDES
#include <stdint.h>
#include <string>
// APPLICATION INCLUDES
// DEFINES
// MACROS
// EXTERNAL FUNCTIONS
// EXTERNAL VARIABLES
// CONSTANTS
// STRUCTS
// TYPEDEFS
// FORWARD DECLARATIONS
/**
* Name: NMEASentence
*/
class NMEASentence
{
public:
static const int MAX_LEN;
static const char START;
static const char CKSM_DELIM;
static const char CR;
static const char …Run Code Online (Sandbox Code Playgroud) 我想使用新的Java 8流API(对此我一个完整的新手)解析为一个特定的行中的CSV文件(其中以"内达"在名称列).使用以下文章获取动机,我修改并修复了一些错误,以便我可以解析包含3列的文件 - 'name','age'和'height'.
name,age,height
Marianne,12,61
Julie,13,73
Neda,14,66
Julia,15,62
Maryam,18,70
Run Code Online (Sandbox Code Playgroud)
解析代码如下:
@Override
public void init() throws Exception {
Map<String, String> params = getParameters().getNamed();
if (params.containsKey("csvfile")) {
Path path = Paths.get(params.get("csvfile"));
if (Files.exists(path)){
// use the new java 8 streams api to read the CSV column headings
Stream<String> lines = Files.lines(path);
List<String> columns = lines
.findFirst()
.map((line) -> Arrays.asList(line.split(",")))
.get();
columns.forEach((l)->System.out.println(l));
// find the relevant sections from the CSV file
// we are only interested in the row with …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下函数std::fmod和std::remainder是如何工作的吗?在这种情况下std::fmod,有人可以解释一下步骤来说明如何:
std::fmod(+5.1, +3.0) = 2.1
Run Code Online (Sandbox Code Playgroud)
同样的事情std::remainder也会产生负面结果。
std::remainder(+5.1, +3.0) = -0.9
std::remainder(-5.1, +3.0) = 0.9
Run Code Online (Sandbox Code Playgroud) 有没有办法允许移动构造函数并禁止复制构造和赋值.我可以想到几个带有文件指针和缓冲区指针(资源句柄等)的类,这些类可以从复制构造和分配中受益.
我使用的是VC2010和GCC 4.5.2.我知道我必须在VC2010类头中声明空的私有赋值和复制构造函数,据我所知,GCC允许在方法之后执行相同的操作时使用某种删除签名.
如果有人有这样一个骨架类的好例子和优点,我将非常感激.在此先感谢约翰
这是一个我希望允许移动的类的示例,但我还想阻止直接分配.这是复制构造函数和operator = private的问题吗?
class LoadLumScanner_v8002 : public ILoadLumScanner {
public:
// default constructor
LoadLumScanner_v8002();
// copy constructor
LoadLumScanner_v8002(const LoadLumScanner_v8002& rhs);
// move constructor
LoadLumScanner_v8002(LoadLumScanner_v8002&& rhs);
// non-throwing copy-and-swap idiom unified assignment
inline LoadLumScanner_v8002& operator=(LoadLumScanner_v8002 rhs) {
rhs.swap(*this);
return *this;
}
// non-throwing-swap idiom
inline void swap(LoadLumScanner_v8002& rhs) throw() {
// enable ADL (not necessary in our case, but good practice)
using std::swap;
// swap base members
// ...
// swap members
swap(mValidatedOk, rhs.mValidatedOk);
swap(mFile, rhs.mFile);
swap(mPartNo, …Run Code Online (Sandbox Code Playgroud) 我是boost库的新用户.由于种种原因,我发现自己更多地考虑采用助推器.据我所知,似乎boost库是一种skunkworks沙箱,其中各种C++ TR功能用于即将进行的标准化,然后被C++委员会采用 - 想想boost :: filesystem和boost :: regex,
作为一个例子,我通过#include标头在visual studio中尝试了一些C++ 11正则表达式功能 - 这很好用,直到我移植到目标power pc平台,当时使用的是CodeSourcery的GCC 4.7.3 .不幸的是,我意识到在运行时,大部分正则表达式实现都是不完整或空的(甚至认为它已编译) - 通过一些功课,我应该事先意识到这一点,但是现在GCC 4.8.x已经出局了,该实现是v3标准C++库的一部分,所以现在它是一个不同的故事.
在一个理想的世界中,标准库应该像开发Java一样 - 编写一次,随处部署 - 但这不是现实.我最终希望转向标准库实现而不是Boost的正则表达式和文件系统实现.
我给出上述正则表达式历史的问题是,开发人员应该如何使用boost,是否可以在标准库采用这些功能时进行简单的搜索和替换boost头和命名空间,或者有更多的事情需要考虑.我想使用纯C++ 11代码而不依赖于第三方库.
我正在尝试使用std :: set_intersection来查找具有公共绑定"name"字段的2种完全不同类型的数据结构之间的公共元素.
我在这里查看了以下输入链接描述,但它似乎迫使我沿着路线在我试图避免的两种不同结构类型之间进行自定义转换(因为这些类型来自第三方)
下面的代码片段显示了我想要实现的目标.
// common field used for set intersection
typedef struct StructA {
std::string mCommonField;
float mFloatValue;
} StructA;
typedef struct StructB {
std::string mCommonField;
int mValue1;
short mValue2;
} StructB;
// initially unsorted list
std::vector<StructA> aStructs = {{"hello", 1.0f}, {"goodbye", 2.0f}, {"foo", 3.0f}};
// initially unsorted list
std::vector<StructB> bStructs = {{"hello", 1, 2}, {"goodbye", 3, 4}, {"bar", 5, 6}};
// sorting both sets before calling std::intersection
std::sort(aStructs.begin(), aStructs.end(),
[](const StructA& …Run Code Online (Sandbox Code Playgroud) 我需要帮助来初始化 boost 日志记录框架,以同时记录到命名日志文件和控制台 - (命名日志文件不需要定期轮换或按照许多 boost 教程进行任何花哨的设置)。
日志文本应该同时发送到两个接收器,但是我需要将控制台输出的格式稍微不同(因为用户将看到它)。我能够使用 boost 示例代码了解记录到 2 个独立接收器的基础知识。对于我需要做的事情来说,它过于复杂,并且就访问适当的记录器而言确实令人困惑。我需要做的就是将带有时间戳的消息发送到日志文件,并具有相同的信息,而无需将时间戳或换行符发送到控制台日志(仅像我通常使用的那样显式放入新行<< std::endl)。我真的很想坚持使用 boost 的日志框架,因为它提供了未来扩展的灵活性。
在这个例子中,我尝试了tail -f日志文件 - 但是日志输出似乎不会在每个日志条目后自动刷新。尽管这对于文件日志来说不是很重要,但这对于控制台输出流至关重要,因为它代表用户将监视的实时活动。
非常感谢任何帮助,甚至更好的一些非常简单的示例代码来使基础工作正常工作。
我设置日志记录的方式(根据上面的链接)如下所示,我想用控制台记录器替换这些注册接收器之一 - 但我不确定如何操作。我希望控制台记录器能够自动刷新。
// Setup the common formatter for all sinks
logging::formatter fmt = expr::stream
<< std::setw(6) << std::setfill('0') << line_id << std::setfill(' ')
<< ": <" << severity << ">\t"
<< expr::if_(expr::has_attr(tag_attr))
[
expr::stream << "[" << tag_attr << "] "
]
<< expr::smessage;
// Initialize sinks
typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
boost::shared_ptr<text_sink> sink = …Run Code Online (Sandbox Code Playgroud) 谁能告诉我如何使boost::filesystem::path不区分大小写?通常,区分大小写是本机平台决定,但是对于我的应用程序来说这并不是那么简单,因为路径详细信息是从二进制文件中提取的,并且应用程序要求是无论我在什么平台上运行,我都必须处理所有路径都不区分大小写。
迄今为止,我一直这样做的方法是使用boost::filesystem::path::generic_string()方法将我正在比较的路径放入通用字符串格式中以进行字典比较。接下来,我将字符串转换为小写并使用 std::string 函数来执行比较和其他运算符方法。显然,这是次优的,因为我希望能够对路径而不是字符串执行字典比较。在内部,boost 的路径运算符 <()实现使用路径迭代器进行巧妙的字典式路径比较 - 这与字符串字典式比较不同。
我认为有某种方法提供特殊的用户定义字符串类型作为构造函数中增强路径的内部表示,但我不确定如何做到这一点。通常,这种性质的大小写不敏感将通过关联的特征类来执行 - 正如您在下面用于 UtlCIString(实用程序不区分大小写的字符串)的不区分大小写的字符串特征字符类中所看到的。如果可以将不同的字符串类型关联为内部字符串类,我将使用以下内容,但我不确定如何:
// case insensitive character traits
// inherited copy (preserves case),
// case insensitive comparison, search
struct traits_nocase : std::char_traits<char>
{
static bool eq(const char& c1, const char& c2) {
return toupper(c1) == toupper(c2);
}
static bool lt(const char& c1, const char& c2) {
return toupper(c1) < toupper(c2);
}
static int compare(const char* s1, const char* s2, …Run Code Online (Sandbox Code Playgroud)