这就是事情,似乎可以传递一个包含一些静态函数的模板化结构:
template <class T> struct FunctionHolder {};
template <> struct FunctionHolder<string> {
static void f(const string &s) {
cout << "f call " << s << endl;
}
};
template <class Key, class Value, class Holder = FunctionHolder<Key>>
class Foo {
public:
Foo(Key k) {
Holder::f(k);
}
};
int main(int argc, char *argv[]) {
Foo<string, int> foo = Foo<string, int>("test_string");
}
但是,如果没有在模板化结构上静态定义,是否可以直接传递模板化函数?我已经尝试了这个并且它不会编译:
template <class string> static void f(const string &s) {
cout << "f call " << k << endl;
}
template <class Key, class Value, typename func<Key>> class Foo {
public:
Foo(Key k) {
func(k);
}
};
int main(int argc, char *argv[]) {
Foo<string, int> foo = Foo<string, int>("test_string");
}
问这个因素,强制创建虚拟结构(包含一堆静态函数的结构)并不是很酷,可以用作主类的模板类型。
答案 0 :(得分:1)
不幸的是,功能模板不能用作template template arguments;您可以使用函数指针作为非类型模板参数,例如
template <class Key, class Value, void(*func)(const Key&) = f<Key>> class Foo {
public:
Foo(Key k) {
func(k);
}
};