从常量字符*、字符*参数到标准::字符串的直接转换接口
Cut-over interfaces from const char*, char* arguments to std::string
我正在处理遗留C++代码,需要积极的重构。代码中的主要问题是,传递const char*
,char*
参数,如下所示。const char*
变量是传递内部 char 数组(主要是用户输入(进行验证,"char*"通常从扩展验证器获取任何错误详细信息。这种类型的代码在代码库中无处不在。
virtual bool ValidateField(const char* pointerToDataBuffer, char* error)
{
// extended codes by client teams.
}
我正在考虑更改以下界面,
virtual bool ValidateField(const std::string copyOfBufferInside, std::string& error)
{
// do stuff as before.
}
我的问题:
- 这有巨大的性能问题吗?由于 std::string 构造。通常内部缓冲区的长度约为 0-31,将来可能会增加。
- 对于这种情况,还有其他紧凑重构建议吗?
注意:编译器是GCC 4.9.3。
编辑:内部缓冲区变量采用 char[],而不是 std::string。将来可能会转换为 std::string。但这里的情况并非如此。
考虑使用基于类型的错误处理和 boost::string_view 来处理各种类似字符串的输入:
http://coliru.stacked-crooked.com/a/22e9ec17b14992d1
#include <string>
#include <boost/variant.hpp>
#include <boost/utility/string_view.hpp>
#include <iostream>
#include <type_traits>
struct validation
{
struct error
{
std::string message;
};
struct success
{
};
using result = boost::variant<success, error>;
template<class OnSuccess, class OnFailure>
struct visitor_impl : boost::static_visitor<void>
{
template<class A1, class A2>
visitor_impl(A1&& s, A2&& f)
: on_success(s)
, on_failure(f)
{}
void operator()(success const&) const
{
on_success();
}
void operator()(error const& f) const
{
on_failure(f.message);
}
OnSuccess on_success;
OnFailure on_failure;
};
template<class OnSuccess, class OnFailure>
static auto visitor(OnSuccess&& s, OnFailure&& f)
{
using success_f = typename std::decay<OnSuccess>::type;
using failure_f = typename std::decay<OnFailure>::type;
return visitor_impl<success_f, failure_f>
{
std::forward<OnSuccess>(s),
std::forward<OnFailure>(f)
};
}
};
validation::result ValidateField(boost::string_view value)
{
auto result = validation::result(validation::success {});
if (value != "foo")
result = validation::error { "not foo" };
return result;
}
int main()
{
std::string bar = "bar";
boost::apply_visitor(validation::visitor(
[]() { std::cout << "is foon"; },
[](std::string const& msg) { std::cout << msg << 'n'; }
), ValidateField(bar));
std::string foo = "foo";
boost::apply_visitor(validation::visitor(
[]() { std::cout << "is foon"; },
[](std::string const& msg) { std::cout << msg << 'n'; }
), ValidateField(foo));
const char* pfoo = "foo";
boost::apply_visitor(validation::visitor(
[]() { std::cout << "is foon"; },
[](std::string const& msg) { std::cout << msg << 'n'; }
), ValidateField(pfoo));
}
预期输出:
not foo
is foo
is foo
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错