C++ 可变模板类的可变模板
我正在尝试创建一个名为C++ 可变模板类的可变模板,c++,templates,variadic,C++,Templates,Variadic,我正在尝试创建一个名为Choose的函数,该函数可以将以下内容作为参数: template<typename... Args> class Option { Option(Args... arguments) { // irrelevant } // ... } void Foo() { Choose( Option<int, int>(3, 5), Option<int&
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)
);
}
但是,我无法实现我的最终目标,因为我无法找到正确的
语法。我希望你能在正确的方向上帮助我。我不认为你能直接做你想做的事情——你需要像“一包一包”这样的东西,而没有这样的东西
如果希望得到更好的错误消息,请编写一个静态断言
,测试传入的每个类型是否为选项
:
// 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
}
//检查所有值是否为真的帮助器模板
模板
构造所有的真实;
模板
struct all_true:std::true_type{};
模板
struct all_true:std::integral_常量{};
模板
结构选项
{
选项(参数…/*参数*/)
{
//无关的
}
// ...
};
//测试类型是否为选项的trait类
模板
结构是_选项:std::false_类型{};
模板
struct是_option如果一次处理一个参数,则标准可变模板解决方案工作良好:
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)...);
}
void Choose()
{
//什么也不做,列表结束
}
模板
void Choose(const选项您始终可以将其作为模板void Choose(EnemyAIState&state,Opt…选项)
。噢,哇哈哈,新鲜的想法总是更好。现在它起作用了,我仍然对这是否可能感兴趣。我的意思是我开始的方式。我不认为这是可能的。如果你想要更好的错误消息,请使用静态断言
@AartStuurman:答案不包含在问题中。如果你的“答案”与T.C.的答案不同,请在这一页上作为一个新的答案来发表。这很酷。我根本不知道C++中的断言。非常感谢,这给了一些清晰的信息。下面的链接提供了你的ISSOutlook函数的一个通用版本,这对于阅读这个问题的人可能是有用的。
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)...);
}