我试图在一个函数中创建一个折叠表达式,它用来自字符串向量的一些值填充函数的输出参数。我的折叠表达式是这样的:
((if constexpr (std::is_integral_v<Args>)
{
args = std::stoi(vec[index++]);
}
else if constexpr (std::is_same_v<Args, std::string>)
{
args = vec[index++];
}
else
{
throw std::invalid_argument("Unsupported argument type.");
}), ...);
但它无法编译,并显示一个奇怪的错误消息:
clang: error: expected expression
或
gcc: error: expected primary-expression before 'if'
(as参见https://gcc.godbolt.org/z/xeq3j6oE7)
有没有人有关于如何正确解决这个问题的提示?
编辑
这个问题的完整背景是这个简短的应用程序:
#include <vector>
#include <string>
#include <type_traits>
#include <iostream>
#include <stdexcept>
template <typename... Args>
void populateArgs(std::vector<std::string>& vec, Args&... args)
{
const size_t numArgs = sizeof...(Args);
if (vec.size() != numArgs)
{
throw std::invalid_argument("Number of arguments doesn't match the size of the vector.");
}
int index = 0;
((if constexpr (std::is_integral_v<Args>)
{
args = std::stoi(vec[index++]);
}
else if constexpr (std::is_same_v<Args, std::string>)
{
args = vec[index++];
}
else
{
throw std::invalid_argument("Unsupported argument type.");
}), ...);
}
int main()
{
std::vector<std::string> vec{ "1", "2", "3", "hello" };
short a;
int b;
long long c;
std::string d;
populateArgs(vec, a, b, c, d);
std::cout << "a = " << a << ", b = " << b << ", c = " << c << ", d = " << d << std::endl;
// Output: a = 1, b = 2, c = 3, d = hello
}
2条答案
按热度按时间eqqqjvef1#
就像这样:
这将创建一个lambda并立即调用它。
我记得这在MSVC上引起了一些问题。如果不适合你,你可以试试:
或单独的模板函数。
knpiaxh12#
if constexpr
imho并不是一个在类型上进行“切换”的好方法。我建议你最好创建一个函数模板的重载。此外,我强烈建议引发一个编译器错误来指示传递给
populateArgs
的参数是无效的。godbolt上的代码