【问题标题】:How to allow a function to take in specified types?如何允许函数接受指定的类型?
【发布时间】:2019-10-18 21:29:30
【问题描述】:

所以我希望我的函数接受一个模板化参数,如下所示:

template <typename T>
void foo(T test)

我只希望foo 接受我指定的所有这些类型。假设我有 Image&lt;cam1&gt;Image&lt;cam2&gt;Other&lt;cam1&gt;--> 如果我只希望 Image&lt;cam1&gt;Image&lt;cam2&gt; 成为进入 foo() 的类型,我该如何指定?

【问题讨论】:

  • C++20 会有概念,所以你可以很容易地做到这一点。对于 C++20 之前的版本,您可以为此使用 std::enable_if,使用 SFINAE 技术。
  • @geza 抱歉,这不是很清楚。你能再解释一下吗?
  • 为什么需要模板化参数?是否有您想要允许哪些类型的模式? (随心所欲并不一定是坏事,但它确实与使用模板的典型原因背道而驰。)

标签: c++ templates sfinae template-argument-deduction


【解决方案1】:

如果我只希望 Image&lt;cam1&gt;Image&lt;cam2&gt; 成为进入 foo 的类型,我该如何指定?

如下?

template <typename T>
typename std::enable_if<std::is_same<T, cam1>::value
                     || std::is_same<T, cam2>::value>::type foo (Image<T> test)

【讨论】:

  • 如果有很多地方需要检查相同的地方,请提供别名:template&lt;typename T&gt; using allowed_type = typename std::enable_if&lt; std::is_same&lt;T, cam1&gt;::value || std::is_same&lt;T, cam2&gt;::value&gt;::type; 并简单地使用allowed_type&lt;T&gt;
  • 好吧,如果输入实际上更复杂怎么办...输入也可以是Image&lt;settings1, cam1&gt;Image&lt;settings2, cam2&gt;等模板...我试过做typename std::enable_if&lt;std::is_same&lt;T, &lt;settings1, cam1&gt;::value || std::is_same&lt;T, &lt;settings2, cam2&gt;::value&gt;::type foo (Image&lt;T&gt; test)但它似乎无法编译
【解决方案2】:

我同意 max66 的 answer,尤其是在不止一次使用允许的模板参数集的情况下(请参阅 Jejo 的 comment)。另一种不使用SFINAE 的方法是:

namespace detail {
template <typename T>
void foo(Image<T> test) {}
}

void foo(Image<Cam1> test) { return detail::foo(test); }
void foo(Image<Cam2> test) { return detail::foo(test); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多