作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑:
#include <type_traits>
template <typename>
struct Tag {};
template <typename T>
auto tag = Tag<T>{};
template <typename...>
struct SelectorImpl;
// 1
template <auto... xs>
struct SelectorImpl<std::integral_constant<decltype(xs), xs>...>
{};
// 2
template <typename T, Tag<T>* tag, auto... xs>
struct SelectorImpl<std::integral_constant<decltype(tag), tag>,
std::integral_constant<decltype(xs), xs>...>
{};
template <auto... params>
struct Selector
: SelectorImpl<std::integral_constant<decltype(params), params>...>
{};
int main() {
Selector<&tag<int>, 1, 2>{};
}
gcc 和 clang 都无法编译它,报告 SelectorImpl
的特化不明确。我相信特化 #2 更专业。我错了吗?和here是同一个问题吗? ?是错误吗?
最佳答案
首先,我想确定 <char X>
优先于 <auto X>
.所以我写了这个简单的测试:https://godbolt.org/g/Hy6NVB
template<auto...>
struct TestSingleImpl;
// 1
template<auto x>
struct TestSingleImpl<x> { static constexpr bool value = false; };
// 2
template<char x>
struct TestSingleImpl<x> { static constexpr bool value = true; };
static_assert(TestSingleImpl<1234>::value == false, "1");
static_assert(TestSingleImpl<'a'>::value == true, "2");
结果:是的,它有优先权(没有歧义)
然后我用可变参数应用了相同的例子:https://godbolt.org/g/7mWaeH
template <typename...>
struct Test;
// 1
template<auto v, auto... x>
struct Test<std::integral_constant<decltype(v), v>,
std::integral_constant<decltype(x), x>...>
{
static constexpr bool value = true;
};
// 2
template<char v, auto... x>
struct Test<std::integral_constant<char, v>,
std::integral_constant<decltype(x), x>...>
{
static constexpr bool value = false;
};
template <auto... params>
struct Selector : Test<std::integral_constant<decltype(params), params>...> {};
static_assert(Selector<1234, 1, 2>::value == true, "1"); // 1 - ok
static_assert(Selector<'a', 1, 2>::value == false, "2"); // 2 - AMBIGUITY
看起来像template<char v, auto... x>
不优先于 template<auto... x>
.
如果我们删除 std::integral_constant
,它工作正常:https://godbolt.org/g/grRC8h
这证实了错误:)
template <auto...>
struct Test;
// 1
template<auto v, auto... x>
struct Test<v, x...>
{
static constexpr bool value = true;
};
// 2
template<char v, auto... x>
struct Test<v, x...>
{
static constexpr bool value = false;
};
static_assert(Test<1234, 1, 2>::value == true, "1"); // 1 - ok
static_assert(Test<'a', 1, 2>::value == false, "2"); // 2 - ok
关于c++ - `template <auto>` 和部分类模板特化排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610866/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!