8

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

一般来说,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 模板是一个相当有用的东西。

4

2 回答 2

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 转发到模板中的代码函数。

于 2012-01-12T05:01:17.017 回答
2

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

于 2012-01-12T08:41:10.600 回答