是否可以有一个特征来将 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*
toconst char*
in order to use it further to call functions havingconst char*
parameters using achar*
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/