我正在尝试创建一个名为Choose
的函数,它可以将以下内容作为参数:
template<typename... Args>
class Option
{
Option(Args... arguments)
{
// irrelevant
}
// ...
}
void Foo()
{
Choose(
Option<int, int>(3, 5),
Option<int>(7,123),
Option<int, int, int, int>(1, 2, 3, 4)
);
}
所以我有一个具有可变类型的类,我想创建一个函数,该函数接受该类的任意数量的实例,其中每个实例的类型都可以有different
个参数。
我能够创建这样一个函数,其中所有实例都需要为其类型提供相同的参数:
template <template <typename... Args> class... Opt, typename... Args>
void Choose(EnemyAIState& state, Opt<Args...>... option)
{
// irrelevant
}
void Foo()
{
Choose(state,
Option<int>(1),
Option<int>(2),
Option<int>(3)
);
}
然而,我无法实现我的最终目标,因为我找不到合适的syntax
来使用。我希望你能帮助我朝着正确的方向前进。
答案 0 :(得分:2)
我不认为你可以直接做你想要做的事 - 你需要像包装一样的东西&#34;并且没有这样的东西
如果您想要更好的错误消息,请编写一个static_assert
来测试传入的每种类型是Option
:
// helper template that checks all of values are true
template<bool... values>
struct all_true;
template<>
struct all_true<> : std::true_type { };
template<bool b, bool...values>
struct all_true<b, values...> : std::integral_constant<bool, b && all_true<values...>::value> { };
template<typename... Args>
struct Option
{
Option(Args... /*arguments*/)
{
// irrelevant
}
// ...
};
// trait class that tests that a type is an Option
template<typename T>
struct is_option : std::false_type { };
template<typename... Args>
struct is_option<Option<Args...>> : std::true_type { };
template <typename... Opt>
void Choose(Opt... arguments)
{
// check that each type is an Option
static_assert(all_true<is_option<Opt>::value...>::value, "Arguments must all be Options");
// irrelevant
}
答案 1 :(得分:1)
如果一次处理一个参数,标准可变参数模板解决方案效果很好:
void Choose()
{
//do nothing, end of list
}
template <typename... Args, class... Rest>
void Choose(const Option<Args...>& option, Rest&&... rest)
{
//irrelevant
Choose(std::forward<Rest>(rest)...);
}
它提供了相同的错误消息,你会得到另一种方式,只是在一个更令人生畏的callstack大小。这就是我见过的大多数可变参数模板函数的工作原理:准递归。