想法是创造一系列的特征,但只需要汇编时间特征。 通过单体模版生成数据阵列,并配有成套的果园汇编器,以生成数据而不与经过的字面直接相关。 这样,汇编者不能用字面说明投入,特别是在这种描述很长的情况下。
Godbolt with Corng: https://godbolt.org/z/WdKNjB。
Godbolt with msvc: https://godbolt.org/z/auMEIH。
唯一的问题是模板深度汇编环境。
第一,我们界定了用于储存指数序列的斜体模:
template <int... I>
struct Seq {};
Pushing int to Seq
:
template <int V, typename T>
struct Push;
template <int V, int... I>
struct Push<V, Seq<I...>>
{
using type = Seq<V, I...>;
};
建立顺序:
template <int From, int To>
struct MakeSeqImpl;
template <int To>
struct MakeSeqImpl<To, To>
{
using type = Seq<To>;
};
template <int From, int To>
using MakeSeq = typename MakeSeqImpl<From, To>::type;
template <int From, int To>
struct MakeSeqImpl : Push<From, MakeSeq<From + 1, To>> {};
现在我们可以确定时间序列,即<代码>。 Mark Seq<3,7>=Seq<3,4,5,6,7>。 然而,我们需要在阵列中储存某些特性,但需要汇编时间代表,即具有特性的单体模板参数:
template<char... CHARS>
struct Chars {
static constexpr const char value[] = {CHARS...};
};
template<char... CHARS>
constexpr const char Chars<CHARS...>::value[];
接下来,我们要把选定的特性引向<代码>。 Chars 类型:
template<typename WRAPPER, typename IDXS>
struct LiteralToVariadicCharsImpl;
template<typename WRAPPER, int... IDXS>
struct LiteralToVariadicCharsImpl<WRAPPER, Seq<IDXS...> > {
using type = Chars<WRAPPER::get()[IDXS]...>;
};
template<typename WRAPPER, typename SEQ>
struct LiteralToVariadicChars {
using type = typename LiteralToVariadicCharsImpl<WRAPPER, SEQ> :: type;
};
。
几乎做了。 失踪人员部分是最后lash。 我们可以使用经修改的《守则》文本,但此时此刻,《守则》不再提及:
static constexpr int PastLastOffset(int last_offset, int cur, const char * const str)
{
if (*str == ) return last_offset;
if (*str == / ) return PastLastOffset(cur + 1, cur + 1, str + 1);
return PastLastOffset(last_offset, cur + 1, str + 1);
}
• 最后用于缩小面积:
constexpr int StrLen(const char * str) {
if (*str == ) return 0;
return StrLen(str + 1) + 1;
}
1. 结合一切方法,界定:
#define COMPILE_TIME_PAST_LAST_SLASH(STR)
[](){
struct Wrapper {
constexpr static const char * get() { return STR; }
};
using Seq = MakeSeq<PastLastOffset(0, 0, Wrapper::get()), StrLen(Wrapper::get())>;
return LiteralToVariadicChars<Wrapper, Seq>::type::value;
}()
Lambda的功能是在使用这一宏观方法时有冰、价值类似的感觉。 它还为界定<代码>Wrapper结构创造了条件。 形成这种结构时用宏观字面加插,导致在字面上被限制为类型时的情况。
很抱歉,我不会在生产中使用这种法典。 它是杀人的汇编者。
在安全原因和记忆使用的情况下,我建议使用cker,使用短路建造。