【发布时间】:2017-04-03 15:59:36
【问题描述】:
是否可以有一个特征来将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 中。这让我编写了相当复杂的代码,但我已经检查过并且我知道上面的转换特征用于各种函数调用。我在这里添加它们只是为了查看方法并阐明添加另一个识别类型并返回所需类型的需要。您所有的 cmets 通常都是正确的,但在我的上下文中并非如此。我可能有一个复杂的代码,但我已经尽可能地简化了。
示例代码here
就我而言,问题尚未得到解答,我也找不到解决方案。我这样提出问题:如何编写一个特征方法来匹配char* 与const char*,即char const*,实际上,当我使用typeid 签入msvc 时,声明为const char* 的类型或变量?
【问题讨论】:
-
直接转换成 const char* 怎么样?
-
static_cast有什么问题? -
char*到const char*隐式发生。 -
我不认为
char * c = "test";是有效的 C++ -
@mike 至于你的编辑,你可能简化你的真实代码太多了。尝试提供一个minimal reproducible example,清楚地表明您的实际问题。