说我有N函数,它们具有一组相同的参数。我调用带有参数的工厂方法和一些允许我在N函数之间进行选择的值。

一种不整洁的方法是执行以下if语句:

if(choice == 1)
    foo_one<T>(args);
else if (choice == 2)
    foo_two<T>(args);
etc


很好,除非在我的情况下参数数量很大。因此,工厂方法非常拥挤。

假设我有一个主要函数调用工厂方法:

int main(int argc, char *argv[])
{
    int choice = 1;
    float arg = 1.5;
    foo_choose(choice, arg);
    return 0;
}


我正在考虑分支choice参数,并在那if语句设置函数别名。

这意味着无论N有多大,我只需传递一次参数。

它可能看起来像这样:

template <typename T>
void foo_one(T arg) { std::cout << "foo_one\n"; };

template <typename T>
void foo_two(T arg) { std::cout << "foo_one\n"; };

template <typename T>
void foo_choose(int choice, T arg)
{
    if(choice == 1)
        using foo = foo_one<T>;
    else
        using foo = foo_two<T>;

    foo(arg);
};


但是,我无法使它与模板一起使用。有什么明显的我想念的东西,或者我应该添加一个搜索词。

由于我可能用不同的值为foo_choose多次调用choice,因此我不希望别名foo存在于函数范围之外。

This question suggests也许我走错了路,但是我不确定。

最佳答案

问题所在

template <typename T>
void foo_choose(int choice, T arg)
{
    if(choice == 1)
        using foo = foo_one<T>;
    else
        using foo = foo_two<T>;

    foo(arg);
};


是using语句是作用域语句。这意味着它们仅适用于声明的作用域,因此,一旦进入foo(arg);foo就超出作用域,并且会出现错误。您可以获取指向该函数的指针,而不是获取该函数的别名,然后在最后调用该指针。那团糟看起来像

template <typename T>
void foo_choose(int choice, T arg)
{
    using f_ptr = void(*)(T);
    f_ptr foo;
    if(choice == 1)
        foo = foo_one<T>;
    else
        foo = foo_two<T>;

    foo(arg);
};


注意,您必须指定所有功能模板参数。

关于c++ - 模板函数范围内的条件模板类型别名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55577889/

10-10 21:20
查看更多