gpt4 book ai didi

c++ - 可变参数模板特化

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:08 24 4
gpt4 key购买 nike

所以我尝试使用自定义文字运算符来实现二进制文字。然而,我似乎在模板特化方面做错了什么。 static_assert 被评估,而它不应该:

template <char... bits>
struct bin_imp
{
static constexpr unsigned long long to_ull()
{
static_assert(false,"not binary value");
return 0;
}
};

template <char... bits>
struct bin_imp<'0', bits...>
{
static constexpr unsigned long long to_ull()
{
return bin_imp<bits...>::to_ull();
}
};

template <char... bits>
struct bin_imp<'1', bits...>
{
static constexpr unsigned long long to_ull()
{
return (1ULL << sizeof...(bits)) | bin_imp<bits...>::to_ull();
}
};


template <>
struct bin_imp<>
{
static constexpr unsigned long long to_ull()
{
return 0;
}
};

template <char... bits>
static constexpr unsigned long long operator "" _b ()
{
return bin_imp<bits...>::to_ull();
};

int main(int argc, char* argv[])
{
unsigned int i = 11_b;
return 0;
}

有什么想法吗?

最佳答案

static_assert(false,"not binary value");

编译器拒绝此操作,因为编译器很明显它会失败,即使在解析源代码的第一阶段也是如此。编译器不需要实例化类模板,以便知道 static_assert会失败。

你在这里可以做的是,强制编译器在解析的第二阶段评估条件——即当(类模板的)函数被实例化时。为此,您需要一个类模板,例如:

 template<char ...>
struct always_false : std::false_type {};

现在将其用作:

static_assert(always_false<bits...>::value,"not binary value");

现在编译器无法评估条件直到它实例化always_false<>这恰好总是错误的。

也就是说,解决方案是:在计算表达式时偷懒

关于c++ - 可变参数模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917926/

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