模板模板参数

时间:2016-06-08 10:15:04

标签: c++ templates c++11

假设我使用模板参数构建一个类模板:

template<template<typename> class A> class B;

现在我想进行实例化,例如A是函数接受int(例如template<class T> void f(int)之类的参数)。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

没有。 Template template arguments无法与功能模板一起使用。

  

模板模板参数的模板参数必须是   id-expression命名类模板或模板别名。

答案 1 :(得分:1)

根据另一个答案,模板模板参数不能与函数模板一起使用。但是,您可以通过将函数包装在模板化仿函数中来模拟所需的功能。最简单的是std::function。这是一个愚蠢的例子来证明这一点:

#include <iostream>
#include <functional>

template<template <class A> class T>
class B
{
public:    
    template<typename Arg>
    void invoke(T<Arg> target, Arg arg)
    {
        target(arg);
    }
};

template<typename T>
void f(T arg)
{
    std::cout << arg << std::endl;
}

template<typename T>
using fWrapper = std::function<void(T)>;

int main()
{
    B<fWrapper> b;

    b.invoke<int>(fWrapper<int>(f<int>), 1);

    return 0;
}

答案 2 :(得分:0)

您无法将模板函数传递给其他模板。

您可以像模板功能一样创建行为的模板对象,例如:

struct my_wrapper {
  template<class T>
  static void invoke(int) {};
};

你可以传递一个类型,并期望它有一个名为invoke的静态模板函数,它接受一个类型。