假设我有一个可变参数模板函数
template<typename... Args>
unsigned length(Args... args);
Run Code Online (Sandbox Code Playgroud)
如何使用长度函数找到参数列表的长度?
这个GCC警告意味着什么?
cpfs.c:232:33: warning: ISO C99 requires rest arguments to be used
Run Code Online (Sandbox Code Playgroud)
相关的路线是:
__attribute__((format(printf, 2, 3)))
static void cpfs_log(log_t level, char const *fmt, ...);
#define log_debug(fmt, ...) cpfs_log(DEBUG, fmt, ##__VA_ARGS__)
log_debug("Resetting bitmap");
Run Code Online (Sandbox Code Playgroud)
最后一行是函数实现中的第232行.编译器标志是:
-g -Wall -std=gnu99 -Wfloat-equal -Wuninitialized -Winit-self -pedantic
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用c ++中的可变参数模板实现具有不同访问密钥的映射.我想得到的是使这样的语法工作:
MultikeyMap<int, double, float> map1; // int and double are keys, float is value type
map1[ 2 ] = 3.5;
map1[ 5.7 ] = 22;
MultikeyMap<unsigned long long, int, float, double, int> map2; // more keys, int is value type
map2[100000000000ULL] = 56;
// etc...
Run Code Online (Sandbox Code Playgroud)
我现在看起来像:
template<class V, class... Krest>
class MultikeyMap;
template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected std::map<K, V>,
protected MultikeyMap<V, Krest...>
{
public:
template<class T>
void insert( const T& t, const …Run Code Online (Sandbox Code Playgroud) 参考下面的代码,有人可以弄清楚如何适应
template <typename RET, typename... ARGS1, typename... ARGS2>
RET Mediator::change (Object* o, RET (Object::*f)(ARGS1...), ARGS2&&... args) {
const std::tuple<ARGS2...> t(args...);
for (Object* x : objects)
(x->*f)(std::get<0>(t), o->rating, std::get<1>(t), o->str);
}
Run Code Online (Sandbox Code Playgroud)
因此,每次更改ARGS2时,我都不必重写不同版本.我不介意在参数只包含4个参数的情况下这样做,但是你可以想象如果它远大于4则需要泛化.ARGS1中的类型......应该由不同的类型组成,所以应该有一种方法获得std :: get <0>(t),std :: get <1>(t),...正确放置,以便不需要像上面那样手动完成(即使有是重复类型,然后它们可以简单地放在重复类型的第一个插槽中).下面是完整的代码(上下文是,当Mediator的每个Object订阅者更改时,Mediator的其他Object订阅者应相应地更改):
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
struct Mediator {
std::vector<struct Object*> objects;
void registerObject (Object* o) {objects.emplace_back(o);}
template <typename RET, typename... ARGS1, typename... ARGS2>
RET change (Object*, RET (Object::*)(ARGS1...), ARGS2&&...);
};
struct Object {
int value;
double rating;
char letter;
std::string …Run Code Online (Sandbox Code Playgroud) 我尝试创建批量插入.我使用gorm github.com/jinzhu/gorm
import (
"fmt"
dB "github.com/edwinlab/api/repositories"
)
func Update() error {
tx := dB.GetWriteDB().Begin()
sqlStr := "INSERT INTO city(code, name) VALUES (?, ?),(?, ?)"
vals := []interface{}{}
vals = append(vals, "XX1", "Jakarta")
vals = append(vals, "XX2", "Bandung")
tx.Exec(sqlStr, vals)
tx.Commit()
return nil
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误:
错误1136:列计数与第1行的值计数不匹配,因为我返回错误的查询
Run Code Online (Sandbox Code Playgroud)INSERT INTO city(code, name) VALUES ('XX1','Jakarta','XX2','Bandung', %!v(MISSING)),(%!v(MISSING), %!v(MISSING))
如果我使用手动查询它的工作原理:
tx.Exec(sqlStr, "XX1", "Jakarta", "XX2", "Bandung")
Run Code Online (Sandbox Code Playgroud)
它会产生:
INSERT INTO city(code, name) VALUES ('XX1', 'Jakarta'),('XX2', 'Bandung')
Run Code Online (Sandbox Code Playgroud)
问题是如何使数组接口生成字符串 "XX1", "Jakarta", ...
感谢帮助.
我需要在传递给模板化结构的编译时计算一堆数字的乘积.我成功地做出了一个丑陋的解决方案:
template<std::size_t n1, std::size_t ...args>
struct mul_all
{
static constexpr std::size_t value = n1 * mul_all<args...>;
};
template<>
struct mul_all<0>
{
static constexpr std::size_t value = 1;
};
Run Code Online (Sandbox Code Playgroud)
问题是,每次我必须将0模板args提供给我的结构,就像这样
int main()
{
std::cout << mul_all<1,2,5,4,5,7,0>::value << " "
<< mul_all<4,2,0>::value;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何解决方法来读取最后一个零?
注意:我是TMP的初学者.
在Python 3中,假设您运行一门课程并在学期结束时决定您将删除第一个和最后一个作业成绩,并且仅对其余成绩进行平均:
def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)
print drop_first_last([100,68,67,66,23]);
Run Code Online (Sandbox Code Playgroud)
在Perl 6中:
sub drop_first_last(@grades) {
my ($first, *@middle, $last) = @grades;
return avg(@middle);
}
say drop_first_last(100,68,67,66,23);
Run Code Online (Sandbox Code Playgroud)
导致错误"无法$last在可变参数后放置必需的参数".
那么,在Perl 6中,与Python中的星形表达式相同的是什么?
在以下代码中:
#include <iostream>
struct Base {
virtual ~Base() = default;
template <typename T, typename... Args> void helper (void (T::*)(Args..., int), Args...);
void bar (int n) {std::cout << "bar " << n << std::endl;}
};
struct Derived : Base {
void baz (double d, int n) {std::cout << "baz " << d << ' ' << n << std::endl;}
};
template <typename T, typename... Args>
void Base::helper (void (T::*f)(Args..., int), Args... args) {
// A bunch on lines here (hence the …Run Code Online (Sandbox Code Playgroud) 我正在使用很棒的fmt C++ 库来更优雅地格式化字符串。
我想将一个非变量参数列表传递给fmt::format. 它可能是一个std::vector, 或std::string或其他任何形式,但它始终与格式字符串匹配。
所以fmt::format工作原理如下:
std::string message = fmt::format("The answer is {} so don't {}", "42", "PANIC!");
Run Code Online (Sandbox Code Playgroud)
但我想要的是这样的:
std::vector<std::string> arr;
arr.push_back("42");
arr.push_back("PANIC!");
std::string message = fmt::format("The answer is {} so don't {}", arr);
Run Code Online (Sandbox Code Playgroud)
有没有办法/解决方法来做到这一点?
如何获取参数包的前n个元素?或者最后 n 个元素,或者 [n, n+1, ..., m) 中的一片元素?例如:
head<3>(1, 2.0f, "three", '4') => make_tuple(1, 2.0f, "three")
tail<2>(1, 2.0f, "three", '4') => make_tuple("three", '4')
slice<1,3>(1, 2.0f, "three", '4') => make_tuple(2.0, "three")
Run Code Online (Sandbox Code Playgroud)
这可以通过 std::tuple、std::integer_sequence 和 std::get 的组合来实现,但我想知道是否有更简单的方法。