Type conversion can be the most googled material in daily programming regardless of the kind of language. That is also the case when writing C++ code. For example, I often forget how to convert the std::string to char * and vice versa. llvm::StringRef brings additional complexity definitely into this conversion graph between string compatible types in C++.

This article is a brief note on how to move back and forward among these three data types so that we can later refer to them as necessary.

std::string -> char *

It’s pretty simple. std::string has a method to return the pointer to the underlying character entities. c_str() allows us to do so.

std::string str = "Hello, World";
const char *c = str.c_str();

char * -> std::string

std::string has a constructor that takes the const char* type. Thus, it enables you to create std::string from the char * type.

const char *c = "Hello, World";
std::string str(c);

llvm::StringRef -> std::string

llvm::StringRef has a method to return the string entity, str().

llvm::StringRef stringRef("Hello, World");
std::string str = stringRef.str();

llvm::StringRef -> char *

llvm::StringRef has a method to return the underlying data pointer. data() method will do that.

llvm::StringRef stringRef("Hello, World");
const char *c = stringRef.data();
llvm::StringRef stringRef("Hello, World");
std::string str = stringRef.str();

std::string, char * -> llvm::StringRef

We can construct llvm::StringRef from both types of std::string and char * by its constructor.

std::string str = "Hello, String";
const char *c = "Hello, Char";
llvm::StringRef stringRef1(str);
llvm::StringRef stringRef2(c);

Reference