定义模板规范时无法推断的模板参数

Template parameters that cannot be deduced when template specification is defined

提问人:mouse_00 提问时间:7/21/2023 更新时间:7/21/2023 访问量:44

问:

我正在制作一个模板来指定“好”和“不好”类型。 我想指定模板类模板方法的返回类型很好,但得到错误。 这是我当前的代码(参见 godbolt https://godbolt.org/z/13xbEYYaa):structTemplate parameters that cannot be deduced

#include <iostream>
#include <type_traits>

template <typename T, typename... Args>
struct foo
{
  foo(const T&, Args&&...)
  {
  };
};

template <typename T>
struct bar
{
  template <typename... Args>
  auto func(Args&&... args)
  {
    return foo<bar,Args...>(*this, std::forward<Args>(args)...);
  }
};

template <typename T, typename... Args>
using bar_func_return_type = decltype(std::declval<bar<T>>().func(std::declval<Args>()...));

template <typename T>
struct is_good_type : std::false_type {};

template <typename T, typename... Args>
struct is_good_type<bar_func_return_type<T, Args...>> : std::true_type {};

int main()
{
  static_assert(is_good_type<int, float, double>::value);
  return 0;
}

我应该怎么做才能制定所需的规范,而不是为类制定规范,这实际上是方法的返回类型,因为返回类型可以更改?foo<T, Args...>bar::func

C++ 模板 元编程

评论

0赞 Pepijn Kramer 7/21/2023
当某件事是好的类型时,你需要更清楚一点。我可能不会使用那个 struct/std::false__type/std::good_type,而只是一个函数(或者在 C++20 中是一个概念)。这些更具可读性。您的另一种选择可能是调查static constexpre boolif constexpr
0赞 Jarod42 7/21/2023
任何类型的用户专业化都可能是一个good_type......bar<T>::func<Args...>
0赞 mouse_00 7/21/2023
@Jarod42,如何?返回值基于模板生成foo
0赞 Jarod42 7/21/2023
我让它返回:演示。也许你想要一个特征演示intis_foo

答: 暂无答案