- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这就是我想要做的:
// base case
void f() {}
template <typename T, typename... Ts>
void f() {
// do something with T
f<Ts...>();
}
int main() {
f<int, float, char>();
return 0;
}
它不编译:
prog.cpp: In instantiation of ‘void f() [with T = char; Ts = {}]’:
prog.cpp:6:5: recursively required from ‘void f() [with T = float; Ts = {char}]’
prog.cpp:6:5: required from ‘void f() [with T = int; Ts = {float, char}]’
prog.cpp:10:25: required from here
prog.cpp:6:5: error: no matching function for call to ‘f()’
prog.cpp:6:5: note: candidate is:
prog.cpp:4:6: note: template<class T, class ... Ts> void f()
prog.cpp:4:6: note: template argument deduction/substitution failed:
prog.cpp:6:5: note: couldn't deduce template parameter ‘T’
This线程显示了一种解决此问题的方法,但基本情况必须是模板。我不太喜欢它,因为据我所知,我将不得不复制适用于 T 的代码。有没有办法避免这种情况?
到目前为止,我想出了两个解决方案 ( http://ideone.com/nPqU0l ):
template <typename...> struct types_helper {};
// base case
void f(types_helper<>) {}
template <typename T, typename... Ts>
void f(types_helper<T, Ts...>) {
// do something with T
f(types_helper<Ts...>());
}
int main() {
f(types_helper<int, float, char>());
return 0;
}
#include <type_traits>
struct end_of_list;
template <typename T>
void f() {
static_assert(std::is_same<T, end_of_list>::value, "error");
}
template <typename T1, typename T2, typename... Ts>
void f() {
// do something with T
f<T2, Ts...>();
}
int main() {
f<int, float, char, end_of_list>();
return 0;
}
我想知道是否有更好的方法来做到这一点。
最佳答案
另一种方法是将非模板函数 f
变成可变模板函数,它接受零个或多个模板参数(另一个 f
需要一个或多个模板参数) .然后为了避免歧义,SFINAE 在参数个数不为零时去掉这个模板函数。好吧,一个代码胜过 1000 个单词:
#include <type_traits>
template <typename... Ts>
typename std::enable_if<sizeof...(Ts) == 0>::type f() {
}
template <typename T, typename... Ts>
void f() {
// do something with T
f<Ts...>();
}
关于c++ - 没有形式参数的可变函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16758620/
views.py from django.shortcuts import render from basic_app.forms import UserForm,UserProfileInfoFor
我已经将一个程序从 R 翻译成 C++。有问题的程序使用不同的值运行自身的多次迭代,然后生成直方图和绘图。 C++ 图形很挑剔,所以我决定将值保存为 csv 格式并在 R 中绘制它们。文件相当大,对于
假设我们有一个符号,有一个符号值、一个函数值和一个属性列表,我们称它为 q .假设我们有一个函数 f带形参v ,例如(f (v) ... )并调用像 (f q) 这样的函数. 我的问题是:到底传递给
当我在 R 中运行以下代码时, library(mclust) data(iris) mc <- Mclust(iris[,1:4], 3) plot(mc, data=iris[,1:4], wha
我是一名优秀的程序员,十分优秀!