为什么在C ++ 11中使用类型参数包后不允许使用整数值参数包?

时间:2012-01-12 03:44:01

标签: c++ c++11 variadic-templates

如果没有一个例子,这个问题几乎没有意义。所以这就是我要做的。

通常,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模板是一个非常有用的东西。

2 个答案:

答案 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)

因为没有人认为有这个功能是值得的。可变参数模板的设计旨在简单且有效。其他潜在的高级和实用功能也未包括在内。