由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - c++ 如何重用一段代码,并把其中加法变成减法
相关主题
请教C++ call-by-ref & call-by-val的问题C++14新特性
template 疑问求教一个python lambda问题
C++ 程序求助find bugs of c++ codes
C++ template Questions (转载)问一个C++的问题
lambda的一个疑问请教一个关于std::function的问题
lambda到底有什么好?这个是什么设计模式?
我对为什么使用FP的理解 (补)用STL map的时候怎么自己定义大小比较的关系
C++11的lambda不会破坏可读性吗?C++ Q02:
相关话题的讨论汇总
话题: oper话题: pos1话题: pos2话题: foo话题: void
进入Programming版参与讨论
1 (共1页)
y****n
发帖数: 15
1
如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
这段代码对性能的要求比较高,所以不想用lambda表达式。
void add(...) {...}
void subtract(...) {...}
...
for (int x = 0; x < n - offset; x++)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
}
...
c*********e
发帖数: 16335
2
void myOperation(...,int OPER) {

v_out[pos1] = ( OPER == -1 ? (v_in[pos1] - v_in[pos2] ): (v_in[pos1] + v_
in[pos2] ) );

如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
这段代码对性能的要求比较高,所以不想用lambda表达式。
void add(...) {...}
void subtract(...) {...}
...
for (int x = 0; x < n - offset; x++)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
}
...

【在 y****n 的大作中提到】
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}
: ...
: for (int x = 0; x < n - offset; x++)
: {
: long pos1 = x * m;
: long pos2 = (x + offset) * m;

t****t
发帖数: 6806
3
you can use macro (define OPER as + or -), or use lambda. lambda expression
has nothing to do with performance. in fact, lambda expression is used as
anonymous functor, which keeps performance.

【在 y****n 的大作中提到】
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}
: ...
: for (int x = 0; x < n - offset; x++)
: {
: long pos1 = x * m;
: long pos2 = (x + offset) * m;

y****n
发帖数: 15
4
多谢你的指点。
我按下面方式定义macro,用visual studio 2008编译。
但在实际执行add()时,执行的却是减法操作。
如果在add()和subtract()的最后加上"#undef OPER",则会出现编译错误,提示在foo
中找不到OPER的定义。
void add(...)
{
#define OPER +
foo(...)
}
void subtract(...)
{
#define OPER -
foo(...)
}
void foo(...)
{
...
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
...
}

expression

【在 t****t 的大作中提到】
: you can use macro (define OPER as + or -), or use lambda. lambda expression
: has nothing to do with performance. in fact, lambda expression is used as
: anonymous functor, which keeps performance.

y****n
发帖数: 15
5
这种方式在循环体中,需要多余的比较操作: OPER == -1 ?
这样做的开销有多少?
OPER与-1比较,而不是与0或1比较,速度会更快么?

v_

【在 c*********e 的大作中提到】
: void myOperation(...,int OPER) {
:
: v_out[pos1] = ( OPER == -1 ? (v_in[pos1] - v_in[pos2] ): (v_in[pos1] + v_
: in[pos2] ) );
:
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}

l*********s
发帖数: 5409
6
write a template function

【在 y****n 的大作中提到】
: 这种方式在循环体中,需要多余的比较操作: OPER == -1 ?
: 这样做的开销有多少?
: OPER与-1比较,而不是与0或1比较,速度会更快么?
:
: v_

c*****m
发帖数: 1160
7
copy一份成为一个新的函数算了。这也算重用。
t****t
发帖数: 6806
8
no, that's not how macro works. to use macro, you need to write:
define FOO \
{ \
/*...*/ \
v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
}
#define OPER +
void add(...)
FOO
#undef OPER
#define OPER -
void subtract(...)
FOO
#undef OPER
it's not a very pleasant solution, of course. i won't recommend that.

foo

【在 y****n 的大作中提到】
: 多谢你的指点。
: 我按下面方式定义macro,用visual studio 2008编译。
: 但在实际执行add()时,执行的却是减法操作。
: 如果在add()和subtract()的最后加上"#undef OPER",则会出现编译错误,提示在foo
: 中找不到OPER的定义。
: void add(...)
: {
: #define OPER +
: foo(...)
: }

N8
发帖数: 110
9
template

no, that's not how macro works. to use macro, you need to write:
define FOO \
{ \
/*...*/ \
v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
}
#define OPER +
void add(...)
FOO
#undef OPER
#define OPER -
void subtract(...)
FOO
#undef OPER
it's not a very pleasant solution, of course. i won't recommend that.
foo

【在 t****t 的大作中提到】
: no, that's not how macro works. to use macro, you need to write:
: define FOO \
: { \
: /*...*/ \
: v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
: }
: #define OPER +
: void add(...)
: FOO
: #undef OPER

c*********e
发帖数: 16335
10
哪位给一个template的写法?

【在 N8 的大作中提到】
: template
:
: no, that's not how macro works. to use macro, you need to write:
: define FOO \
: { \
: /*...*/ \
: v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
: }
: #define OPER +
: void add(...)

相关主题
lambda到底有什么好?C++14新特性
我对为什么使用FP的理解 (补)求教一个python lambda问题
C++11的lambda不会破坏可读性吗?find bugs of c++ codes
进入Programming版参与讨论
k**********g
发帖数: 989
11
template
struct add_op {
T operator () (const T& src0, const T& src1) const
{ return src0 + src1; }
};
template
struct sub_op {
T operator () (const T& src0, const T& src1) const
{ return src0 - src1; }
};
template
class vec_apply {
void operator () (T* v_out, T* vec_in, long len, ...)
{
oper op; // creates a oper object (functor) on stack - does not take
space, because it will be optimized away when compiler finds that it is a
functor.
for (long k = 0; k < len; ++k)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
{
// Calls the functor of the object. In release mode (inline
optimizations on), will become same as (v_in[pos1] + v_in[pos2])
v_out[pos1] = op(v_in[pos1], v_in[pos2]);
}
}
}
}
c*********e
发帖数: 16335
12
template
struct add_op {
T operator () (const T& src0, const T& src1) const
{ return src0 + src1; }
};
第三行最后一个const是啥目的?

【在 k**********g 的大作中提到】
: template
: struct add_op {
: T operator () (const T& src0, const T& src1) const
: { return src0 + src1; }
: };
: template
: struct sub_op {
: T operator () (const T& src0, const T& src1) const
: { return src0 - src1; }
: };

G*****7
发帖数: 1759
13
write a template function parameterized on function or functors such as std:
:plus and std::minus

【在 y****n 的大作中提到】
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}
: ...
: for (int x = 0; x < n - offset; x++)
: {
: long pos1 = x * m;
: long pos2 = (x + offset) * m;

G*****7
发帖数: 1759
14
or, use std transform.

lambda are resolved by compiler and inlined by optimizer. why the
performance concern?

【在 y****n 的大作中提到】
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}
: ...
: for (int x = 0; x < n - offset; x++)
: {
: long pos1 = x * m;
: long pos2 = (x + offset) * m;

a9
发帖数: 21638
15
你是想咋重用啊?
是编译期间指定还是执行期间?

【在 y****n 的大作中提到】
: 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
: 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
: 这段代码对性能的要求比较高,所以不想用lambda表达式。
: void add(...) {...}
: void subtract(...) {...}
: ...
: for (int x = 0; x < n - offset; x++)
: {
: long pos1 = x * m;
: long pos2 = (x + offset) * m;

b***i
发帖数: 3043
16
期待lz回答这个问题。

【在 a9 的大作中提到】
: 你是想咋重用啊?
: 是编译期间指定还是执行期间?

r****t
发帖数: 10904
17
都在说代码,应该是编译时。

【在 a9 的大作中提到】
: 你是想咋重用啊?
: 是编译期间指定还是执行期间?

y****n
发帖数: 15
18
希望在编译时,生成2个函数:
add()
subtract()
这两个函数中,除了一个位置的符号以外,其余地方都一样。
所以我的问题是如何只写一遍代码,编译出不同的函数。
t****t
发帖数: 6806
19
有人不是给了你模板的写法吗, 就用那个就可以了.

【在 y****n 的大作中提到】
: 希望在编译时,生成2个函数:
: add()
: subtract()
: 这两个函数中,除了一个位置的符号以外,其余地方都一样。
: 所以我的问题是如何只写一遍代码,编译出不同的函数。

i*********n
发帖数: 58
20
Template function with scalar argument.
Compiler will optimize away the flag.
#include
using namespace std;
#define foo_plus foo
#define foo_minus foo
template
int foo(int a, int b) {
return plus ? (a + b) : (a - b);
}
int
main( int args, char *argv[] )
{
cout << foo_plus(5, 2) << endl;
cout << foo_minus(5, 2) << endl;
return 0;
}
1 (共1页)
进入Programming版参与讨论
相关主题
C++ Q02:lambda的一个疑问
stl Compare为何需要重载()?lambda到底有什么好?
c++ operator overloading question我对为什么使用FP的理解 (补)
a c++ questionC++11的lambda不会破坏可读性吗?
请教C++ call-by-ref & call-by-val的问题C++14新特性
template 疑问求教一个python lambda问题
C++ 程序求助find bugs of c++ codes
C++ template Questions (转载)问一个C++的问题
相关话题的讨论汇总
话题: oper话题: pos1话题: pos2话题: foo话题: void