c++ - 如何编写特征转换以将 'const' 添加到类型*

标签 c++ c++11

是否可以有一个特征来将 char* 转换为 const char* 以便进一步使用它来调用具有 的函数>const char* 参数使用 char* 变量?

我有这个(上下文很大,我已经简化了,对于丑陋的代码感到抱歉):

#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <typeinfo>

template<typename T, typename U, std::enable_if_t<std::is_same<T, U>::value, int> = 0>
T convert_type(U _in)
{
    return _in;
}

template<typename T, typename U, std::enable_if_t<std::is_same<T, std::add_lvalue_reference_t<U>>::value, int> = 0>
T& convert_type(U& _in)
{
    return _in;
}

template<typename T, typename U, std::enable_if_t<std::is_same<T, std::add_lvalue_reference_t<std::add_const_t<U>>>::value, int> = 0>
T& convert_type(U& _in)
{
    return _in;
}

template<typename T, typename U, std::enable_if_t<std::is_same<T, std::add_pointer_t<U>>::value, int> = 0>
T convert_type(U& _in)
{
    return std::addressof(_in);
}

int main() {

    char* c = new char[sizeof "test"];
    strcpy(c, "test");

    const char * cc = convert_type<const char *, char *>(c); // here not compilable yet due to lack of the right convert_type specialization

    cout << c;

    delete[] c;
    return 0;
}

为了澄清,我将 SpiderMonkey 嵌入到 Illustrator API 脚本中。这使我编写了非常复杂的代码,但我已经检查过并且知道上面的转换特征用于各种函数调用。我在这里添加它们只是为了了解该方法并澄清添加另一个识别类型并返回所需类型的需要。您的所有评论通常都是正确的,但不适合我的情况。我的代码可能很复杂,但我已经尽可能地简化了它。

示例代码here

就我而言,问题尚未得到解答,我找不到解决方案。我这样提出问题:如何编写一个特征方法来匹配 char*const char*,实际上是 char const* ,当我使用 typeid checkin msvc 时,声明为 const char* 的类型或变量?

最佳答案

Is it possible to have a traits in order to convert, let's say, char* to const char* in order to use it further to call functions having const char* parameters using a char* variable?

正如评论中所指出的,根本不需要特征转换,因为 char* 指针可以与 const char* 指针同等地使用任何时间,因为转换是隐式的(对于 char 之外的任何其他类型都相同)。


请注意 main() 函数中的行

char * c = "test";

不是有效的 C++ 语法。 "test" 实际上是一个 const char [5] 类型,您不能合法地将其分配给 const char* 指针以外的其他类型。
至少任何向该指针写入值的尝试都将是未定义的行为

大多数符合 c++11 的编译器都会对该语句发出警告。


至于您现在编辑的示例

char* c = new char[sizeof "test"];
strcpy(c, "test");

//const char * cc = convert_type<const char *, char *>(c);

不需要使用 convert_type() 特征函数,您可以简单地编写(正如评论中也提到的):

const char * cc = c;

关于c++ - 如何编写特征转换以将 'const' 添加到类型*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794737/

相关文章:

c++ - 在 qt 中用 C++ 创建 .csv 文件

c++ - 未调用 move 赋值运算符

c++ - 部分模板绑定(bind),创建新模板作为类型

c++ - 错误 : cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’

c++ - Phoenix::bind for C++11 lambdas in boost::spirit::qi 语义 Action

c++ - 指针映射中的默认值 nullptr 是否定义了行为?

c++ - 如何在 Windows 7 的 C++ 中为虚拟文件夹创建快捷方式?

c++ - 如何在现有的 C++ 项目中添加对话框资源

c++ - 如何从另一台 ubuntu 机器在 ubuntu 中运行 c++ 程序?

c++ - 我可以检查 C++ 迭代器是否为 null 吗?