在编译时选择一个变量

sen*_*iwa 5 c++ templates

我希望能够通过布尔指定我需要在编译时使用哪两个变量,所有这些都没有直接的SFINAE.只有一个函数,类似std::conditional但不返回类型.

所以,例如在课堂上test,我想要

class test
{
    template <class T, bool first, MAGIC_HAPPENS var>
    void apply_it(T &t)
    {
        for (auto &p : var) p.apply(t);
    }

    std::vector<myfunction> var1;
    std::vector<myfunction> var2;
}
Run Code Online (Sandbox Code Playgroud)

使用很简单:如果我指定first == true那么它应该应用循环var == var1,否则var == var2.

可能吗?

Mas*_*nes 5

只是为了好玩(*),对当前代码片段的最小 C++ 17(**)修改可能是

class test
{
    std::vector<myfunction> var1;
    std::vector<myfunction> var2;

    template <class T, bool first, std::vector<myfunction> test::*var = first ? &test::var1 : &test::var2 >
    void apply_it(T &t)
    {
        for (auto &p : this->*var) p.apply(t);
    }
};
Run Code Online (Sandbox Code Playgroud)

(*)我认为没有哪种情况比其他建议的解决方案更可取...

(**)据我所知,由于模板非类型指针参数的链接要求,这需要C++ 17 ...