如果没有一个例子,这个问题几乎没有意义。所以这就是我要做的。
通常,C ++允许以下内容:
template<class T, class U, T t, U u>
void func() {}
func<char, int, 'A', 10>();
但似乎它的自然变量扩展不起作用。
template<class...T, T... t>
void func() {}
func<char, int, 'A', 10>();
clang和g ++ 4.7都拒绝上述代码。实例化完成后会显示错误。在我看来,应该明确地解析两个可变列表,因为第一个具有类型而另一个仅具有整数值。
如果上述内容无效,我认为以下内容也不起作用。
template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
我认为Foo模板是一个非常有用的东西。
答案 0 :(得分:8)
(额外>直接回答您的第一个问题,您也可以将template<class...T, T... t> void func() {}
转换为模板内部的模板。这在g ++ 4.6中不起作用,但是在clang 3.0中,因此我花了一段时间才找到它。)
将模板放在模板中:
template<class ... T>
struct func_types {
template <T ... t>
static void func_values() {
// This next line is just a demonstration, and
// would need to be changed for other types:
printf("%c %d\n", t...);
}
};
int main() {
func_types<char, int> :: func_values<'A', 10>();
}
模板内的模板是否可以接受?另一种方法是使用func< tuple<char,int> , make_tuple('A',10) >
的元组。我认为这是可行的,但你可能必须推出自己的元组类(看起来make_tuple不是constexpr
。
最后,您可以按如下方式实现Foo模板:
template<typename Ret, typename ...Args>
struct Foo {
template< Ret (*func)(Args...)>
struct Bar {
template<typename T...>
Bar(T&&... args) {
cout << "executing the function gives: "
<< func(std::forward(args)...) << endl;
}
};
};
int main () {
Foo<size_t, const char*> :: Bar<strlen> test1("hi");
Foo<int, const char*, const char*> :: Bar<strcmp> test2("compare","these");
}
后一个代码在ideone上。为了演示,我实现了一个构造函数,将args转发到代码到模板中的函数。
答案 1 :(得分:2)
因为没有人认为有这个功能是值得的。可变参数模板的设计旨在简单且有效。其他潜在的高级和实用功能也未包括在内。