从自定义类转换为std :: string

时间:2013-11-23 00:17:01

标签: c++ string implicit-conversion

我正在开发一个“MemRef”类来代替std::string,通过传递指针来减少const字符串复制。 MemRef对象只包含char* ptr int len

我希望通过定义将MemRef转换为foo(const string&)的方法,将函数foo(my_memref)称为std::string。我读过的关于“转换构造函数”的内容似乎只解决了将转换为其他数据类型我的类的问题,而不是相反的问题。我还读到转换构造函数通常比它们的价值更麻烦。

有没有办法在类中定义隐式的“转换为其他类型”方法,这样我就可以写(例如)display_string(my_memref)


更新:这是当前的尝试:

// This is a "cast operator", used when assigning a MemRef to a string
MemRef::operator std::string() const {
    // construct a string given pointer and length
    std::string converted(ptr_, len_);
    return converted;                                                           
} 

这是用法:

:
const string foo("ChapMimiReidAnn");
MemRef c(foo.c_str(), 4);
begin_block(c);
:

void
begin_block(const string& s) {
    cout << "begin_block('" << s << "')" << endl;
}

但这是错误:

c++ -c -pg -O0 -fno-strict-aliasing --std=c++11  -arch x86_64  -I/Users/chap/private/WDI/git -I/Users/chap/private/WDI/git/include -I/usr/local/mysql/include -I/usr/local/include   memref_test.cpp
c++ -c -pg -O0 -fno-strict-aliasing --std=c++11  -arch x86_64  -I/Users/chap/private/WDI/git -I/Users/chap/private/WDI/git/include -I/usr/local/mysql/include -I/usr/local/include   MemRef.cpp
c++ -o memref_test memref_test.o MemRef.o -L/usr/local/mysql/lib -lmysqlclient -pg 
Undefined symbols for architecture x86_64:
  "MemRef::operator std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >() const", referenced from:
      _main in memref_test.o

2 个答案:

答案 0 :(得分:2)

您要做的是在MemRef中为std :: string创建一个强制转换运算符:

class MemRef {
public:
    ...
    operator std::string() {
        std::string stringRepresentationOfMemRef;
        ...
        ...
        return stringRepresentationOfMemRef;
    }
    ...
};

答案 1 :(得分:1)

下面的代码应该可以解决问题。 但问题是这段代码不是线程安全的。当通过值传递时,一个简单的转换重载将完成这个技巧,但是通过引用传递有点棘手,因为你需要管理对象的生命周期,以便任何引用(包括传递引用)都是有效的。

#include <stdio.h>
#include <memory.h>
#include <string>

class MyClass
{
public:
  MyClass()
  {
    m_innerString = "Hello";
  };


  operator std::string &()
  {
    return m_innerString;
  }
private:
    std::string m_innerString;
};

void testMethod(std::string &param)
{
  printf("String: %s", param.c_str());
}

int main(int argc, char *argv[])
{
  MyClass testClass;

  testMethod(testClass);
}

AFAIK以线程安全的方式执行此类操作并不是一种简单的方法,因为您永远不会知道被引用的字符串对象的生命周期。 但是,您可以通过使用线程本地存储并为每个线程维护单独的字符串实例来获得某种解决方案。