c++ - 将(某种元)函数应用于一系列类型

标签 c++ c++14 template-meta-programming map-function

我有一个函数:

template <typename T> std::string foo();

您可以将其视为将类型作为输入并生成字符串。

我还有一个参数包,或者一个元组,这对你来说更方便;假设是

using std::tuple<MyParameters...> my_types;

现在,我想调用 foo<T>在每种类型上 T在包中,或在元组的类型定义中,按顺序。

我意识到我可能可以使用诸如 Boost 的 MPL 或 Boost Hana 之类的库来获得它,但我不想将所有这些都粘贴到我的代码中,并且想知道这样做的原理是否可以被“捕获”简明扼要。

注意事项:

  • 如果您能提供适用于通用 lambda 而不是模板函数的答案,可加分。
  • 答案必须是 C++14,而不是 C++17。

最佳答案

恕我直言,对于这类事情,您需要部分特化。 所以结构/类,非函数。

因此,如果您可以要求可变结构 bar 的方法工作,您可以编写 foo() 调用 bar 中的方法> (operator(), by example) 如下

template <typename T>
std::string foo ()
 { return bar<T>()(); }

以下是一个完整的工作示例(我不知道是否足够“简洁”);如果我没记错的话,它是 C++11。

#include <tuple>
#include <complex>
#include <iostream>

template <typename ...>
struct bar;

template <typename T0, typename ... Ts>
struct bar<T0, Ts...>
 {
   std::string operator() ()
    { return "type; " + bar<Ts...>()(); }
 };

template <template <typename ...> class C,
          typename ... Ts1, typename ... Ts2>
struct bar<C<Ts1...>, Ts2...>
 {
   std::string operator() ()
    { return "type container; " + bar<Ts1...>()() + bar<Ts2...>()(); }
 };

template <>
struct bar<>
 { std::string operator() () { return {}; } };

template <typename T>
std::string foo ()
 { return bar<T>()(); }

int main ()
 {
   std::cout << foo<int>() << std::endl;
   std::cout << foo<std::tuple<int, long, short, std::tuple<long, int>>>()
      << std::endl;
   std::cout << foo<std::complex<double>>() << std::endl;
 }

p.s.:我不清楚“使用通用 lambda 而不是模板函数的答案”是什么意思。

你能举个例子吗?

关于c++ - 将(某种元)函数应用于一系列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45787310/

相关文章:

c++ - 如何在 C++03 中使用 "dereference a type"?

c++ - OpenMP "master"编译指示不得包含在 "parallel for"编译指示中

c++ - 在容器上的循环中同时访问更多元素的 STL 方法

c++ - 你能在 C++ 元编程中的 "hop"之间 "linked classes"吗?

c++ - 是否可以检查类型是否已使用特定模板参数实例化?

c++ - 从 std::future<void> 到非标量 std::future<bool> 的转换引发错误

c++ - 在 Mac 上编译 C++ 代码时处理 “dyld: lazy symbol binding failed: Symbol not found” 错误

c++ - 在 gtest 中比较 ptr 和 nullptr

c++ - 标量对象 '***' 在初始值设定项中需要一个元素

c++ - 这是按什么顺序发生的