假设我使用模板参数构建一个类模板:
template<template<typename> class A> class B;
现在我想进行实例化,例如A
是函数接受int(例如template<class T> void f(int)
之类的参数)。有没有办法做到这一点?
答案 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
的静态模板函数,它接受一个类型。