模板函数范围内的条件模板类型别名

时间:2019-04-08 16:32:49

标签: c++ templates alias

说我有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也许我走错了路,但是我不确定。

3 个答案:

答案 0 :(得分:2)

问题

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

这确实带有警告,您必须指定所有功能模板参数。

答案 1 :(得分:1)

如果所有候选对象都是相同类型的函数,则只需设置函数指针的本地数组并从中进行选择:

var messageJson = @"
{
  "message":{
    "token" : "some device token.........",
    "notification" : {
      "body" : "Welcome to StackOverflow",
      "title" : "Hello Marco",
      }
   }
}
";
SendFcmNativeNotificationAsync(messageJson);

live example here

此处的其他答案已经给出了为什么您的原始方法不起作用的解释。我认为我无法补充……

答案 2 :(得分:0)

次要点

无需使用

using foo = foo_one<T>;

跟着

foo(arg);

您最好使用

foo_one(arg);

更重要

您已经注意到,使用级联if / else语句是一个维护问题,很容易导致错误。

最好保留一个可用于将调用分派到适当功能的功能/函数映射。但是,对于函数模板,我认为没有明显的通用类型可以用来创建函数/功能映射。

让我们的家中其他人都有正确的想法表明自己可以做到。