在类型特征中使用可变参数省略号来表示计时持续时间

问题描述 投票:0回答:1

我编写了一个类型特征模板来测试类型是否是

std::chrono::duration<Rep, Period>
。我被困了很长一段时间,不知道如何推导出
Rep
Period

我在 cppreference.com 上为标准类型特征给出的“可能的实现”上构建了这个解决方案。我基本上理解它是如何工作的,但我对第二个测试函数签名中的

...
感到困惑。

  • 在这种情况下,省略号是否像 C 中那样指示可变参数列表?或者在这种情况下它有特殊的含义吗?
  • 省略号如何帮助区分该测试与其他测试?我本以为 SFINAE 足以找出哪个函数签名匹配。但如果我删除省略号,编译器会报告它们不明确。
#include <chrono>
#include <type_traits>

namespace detail {

template <typename T, typename Rep = T::rep, typename Period = T::period>
std::bool_constant<std::is_same_v<T, std::chrono::duration<Rep, Period>>> test();

template <typename>
std::false_type test(...);  // How does `...` help here?

}

template <typename T>
struct is_duration : decltype(detail::test<std::remove_cv<T>::type>()) {};

template <typename T>
constexpr bool is_duration_v = is_duration<T>::value;

static_assert(is_duration_v<std::chrono::high_resolution_clock::duration>);
static_assert(is_duration_v<volatile std::chrono::microseconds>);
static_assert(is_duration_v<const std::chrono::microseconds>);
static_assert(!is_duration_v<double>);
c++ variadic-functions typetraits c++-chrono
1个回答
1
投票

该省略号是否像 C 中那样表示可变参数列表?

是的。

省略号如何帮助区分该测试与其他测试?

它始终是可能的匹配重载中“最不专业”的,因此,如果有另一个匹配重载,则将选择该重载。

© www.soinside.com 2019 - 2024. All rights reserved.