将 C 数组转换为可变参数模板参数

观察myshka

我一直在探索 CPP,想知道是否有可能:

一个可变参数模板类,它将 N 个元素的数组转换为带有可变参数列表的函数调用。

例如,如果给定一个数组,例如

argc = 3, args = { "hello", "10", "0.5" }

我的愿望是能够像这样打电话

Something<std::string, int, float>(3, args);

这将进行一些处理以使用转换后的参数调用函数

我之前探索过的资源是尝试使用 C++14 的表达式折叠或尝试使用递归模板。我认为必须使用参数包和一些定义来转换它。到目前为止,这是我的代码

假设想将 C 字符串数组转换为参数,我创建了许多转换结构

在这里,我有一个结构可以将 char*(数组的元素)转换为某个未知参数

// generic conversion
template <typename T>
struct convert {
  T operator()(char const*) const;
};

// specific convert char* to std::string
template <>
struct convert<std::string> {
  std::string operator()(char const* str) const {
    return std::string(str);
  }
};

// many different convert<> structs for different types...

现在这就是问题所在。在这门课中,我尝试构建 C 字符串的 N 个元素的任意转换器的表示

class Handler {
public:
  virtual bool Handle(int argc, char const** argv);
};

template <typename... Args>
class Command : public Handler {
protected:
  bool Execute(Args... args);

public:
  bool Handle(int argc, char const** argv) override {
    if (argc != sizeof...(Args))
      return false;
    // HELP call convert<> on each type in args then call Execute();
  }
};

对于我的帮助,我探索了其他问题来尝试参数解包或表达式折叠,但它不喜欢他。

例如,命令的一种实现是

class Help : public Command<std::string> {
public:
  bool Execute(std::string sub) {

  }
};

我也尝试使用 CPP14 索引序列,但我的问题是在索引序列中有两个“数组”进行迭代。char** 和可变参数模板。

谢谢!

纪尧姆·拉西科

使用可变参数模板,您可以将多个包扩展为一种模式。

您可以使用它来获得args数组的索引和参数包中的类型。

这是解决方案:

#include <type_traits>
#include <utility>
#include <string>

template<typename T>
struct Convert {
    auto operator()(char const*) -> T {
        return T{};
    }
};

template<typename... Args>
struct Command {
    bool execute(Args...) {
        return true;
    }

    bool handle(int argc, char const** args) {
        // This should be a precondition
        if (argc != sizeof...(Args)) { 
            return false;
        }

        auto sequence = std::index_sequence_for<Args...>{};
        return handleImpl(sequence, args);
    }

    template<std::size_t... S>
    bool handleImpl(std::index_sequence<S...>, char const** args) {
        // both S and Args expanded
        return execute(Convert<Args>{}(args[S])...);
    }
};

int main() {
    Command<int, std::string, double> c;

    char const* args[] = {"1", "blah", "1.2"};

    c.handle(3, args);
}

现场示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将int数组转换为可变参数模板

将递归可变参数模板函数转换为迭代

可变参数模板和C数组

如何:将C ++ 14模板函数扩展为可变参数模板,参数

C ++将变量转换为模板参数

尝试将C ++ 11代码转换为C ++ 03时默认函数模板参数出错

函数采用可变参数模板包将std :: strings转换为const char *?

C ++模板对象数组:是否将UB转换为通用的非类型模板参数?

C ++将std :: function对象传递给可变参数模板

如何将 C 类型的可变参数类型转换为 C++ 样式的可变参数类型?

C ++可变参数模板和隐式转换

C ++可变参数模板类型过滤转换

C ++可变参数模板参数的数量

如何将可变参数模板转换为多个单个模板?(C ++竞争编程调试模板)

在C ++ 11中将静态constexpr数组转换为模板参数

C ++可变参数模板:根据可变参数模板大小列出所有数组元素的优雅方法

C ++将模板参数包从一个可变参数模板传递到另一个可变参数模板会导致编译器错误

c ++ 11递归可变参数模板

C ++ 17可变参数模板折叠

C ++-从可变参数模板制作Tupple

遍历C ++可变参数模板

C ++可变参数模板推导失败

C ++可变参数模板总和

C ++可变参数模板产品

将转换后的integer_sequence插入可变参数模板参数中吗?

C++ 可变数量的可变参数模板参数

C ++ 1y / C ++ 14:将静态constexpr数组转换为非类型模板参数包?

将向量或数组转换为C ++中的参数列表

以元组作为模板参数的 C++ 可变参数模板