Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板类的可变模板_C++_Templates_Variadic - Fatal编程技术网

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)...);
}