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

Sum*_*ant 8 c++ variadic-templates c++11

没有例子,这个问题几乎没有意义.所以这就是我想要做的.

通常,C++允许以下内容:

template<class T, class U, T t, U u>
void func() {}

func<char, int, 'A', 10>();
Run Code Online (Sandbox Code Playgroud)

但似乎它的自然变量扩展不起作用.

template<class...T, T... t>
void func() {}

func<char, int, 'A', 10>(); 
Run Code Online (Sandbox Code Playgroud)

clang和g ++ 4.7都拒绝上述代码.实例化完成后会显示错误.在我看来,应该明确地解析两个可变列表,因为第一个具有类型而另一个仅具有整数值.

如果上述内容无效,我认为以下内容也不起作用.

template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
Run Code Online (Sandbox Code Playgroud)

我认为Foo模板是一个非常有用的东西.

Aar*_*aid 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>();
}
Run Code Online (Sandbox Code Playgroud)

模板内的模板是否可以接受?另一种方法是使用元组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");
}
Run Code Online (Sandbox Code Playgroud)

后一个代码是ideone.为了演示,我实现了一个构造函数,将args转发到代码到模板中的函数.