gpt4 book ai didi

c++ - 在编译时连接模板中的编译时字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:56 26 4
gpt4 key购买 nike

目前我有:

template <typename T> struct typename_struct<T*> {
static char const* name() {
return (std::string(typename_struct<T>::name()) + "*").c_str();
}
};

我想知道我是否可以避免我被迫分配一个字符串来执行连接的整个位。

这一切都发生在编译时,即我打算获取字符串 "int****"当我引用 typename_struct<int****>::name() . (假设我已经为 int 声明了相应的特化,它返回 "int" )

正如现在编写的代码,编译器是否只在编译时与 std::string 进行连接? (我会同意的)或者这样的调用会在运行时产生 4 个基于 std::string 的连接吗? (我不会同意的)

最佳答案

你可以使用这样的东西。一切都发生在编译时。专门化 base_typename_struct 以定义您的原始类型。

template <const char* str, int len, char... suffix>
struct append {
static constexpr const char* value() {
return append<str, len-1, str[len-1], suffix...>::value();
}
};

template <const char* str, char... suffix>
struct append<str, 0, suffix...> {
static const char value_str[];
static constexpr const char* value() {
return value_str;
}
};

template <const char* str, char... suffix>
const char append<str, 0, suffix...>::value_str[] = { suffix..., 0 };


template <typename T>
struct base_typename_struct;

template <>
struct base_typename_struct<int> {
static constexpr const char name[] = "int";
};


template <typename T, char... suffix>
struct typename_struct {
typedef base_typename_struct<T> base;
static const char* name() {
return append<base::name, sizeof(base::name)-1, suffix...>::value();
}
};

template <typename T, char... suffix>
struct typename_struct<T*, suffix...>:
public typename_struct<T, '*', suffix...> {
};


int main() {
cout << typename_struct<int****>::name() << endl;
}

关于c++ - 在编译时连接模板中的编译时字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24783400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com