在发送到 std::vformat 之前如何转换可变参数的类型

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

我想在将来自可变参数参数的特定类型的值发送到 std::vformat() 之前对其进行转换,但我似乎找不到一种方法来实现它。

我尝试获取格式参数,但无法更改它的值,因为 std::format_args::get() 返回 const 值。

还尝试找到一种方法来解压变量、转换值并重新打包以供 std::vformat() 使用。

我还尝试覆盖基本类型的格式化程序,但最终没有被使用。

#include <format>
#include <string>
#include <iostream>
 

template <typename T>
inline void transform(T& valeur) {}
inline void transform(std::string& valeur) {
    valeur.append("abc");
}

inline void transformArgs() {}
template <typename T, typename... Args>
void transformArgs(T& t, Args&&... args) {

  transform(t);
  transformArgs(args...);
}


template <typename... Args>
std::string prepare(std::string requete, Args&&... args)
{
    //I want to add "abc" to any string-like values before using vformat
    std::format_args fmtargs = std::make_format_args(args...);

    const unsigned int nb = sizeof...(args);
    for (unsigned int i = 0; i < nb; ++i) {

        auto arg = fmtargs.get(i);
        //Can't do anything with arg
    }

    transformArgs(args...);

  try {
    return std::vformat(requete, std::make_format_args(args...));
  }
  catch (...) {}

  return ""; 
}

int main() {

  char fixed[] {"banana"};
  auto result = prepare("{} - {} - {} - {}", 5, "litteral string", fixed, std::string("litteraly a string"));
  std::cout << result.c_str();

  /*
    I would expect this output : 
    5 - litteral stringabc - bananaabc - litteraly a stringabc
  */
}
 

这是我尝试的草图 https://godbolt.org/z/red6654sf

编辑:更改了一些内容,以免在示例中出现未定义的行为。

c++ c++20 variadic-templates stdformat
1个回答
0
投票

我建议稍微改变一下方法,而不是让

transform
修改其参数,它应该返回一个将在输入中替换的值。

所以你可以有一组像这样的重载:

std::string transform(std::string str) {
    return str.append("abc");
}
template<std::size_t N> std::string transform(const char(&arr)[N]) {
    return std::string{&arr[0], N - 1}.append("abc");
}
template<std::size_t N> std::string transform(char(&arr)[N]) {
    return std::string{&arr[0], N - 1}.append("abc");
}
template<typename T> T&& transform(T&& value) {
    return static_cast<T&&>(value);
}

并在调用

transform
时包装对
make_format_args
的调用中的所有参数:

编译器资源管理器示例

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