473,883 Members | 1,440 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

class similar to a function object?

Suppose I have a datastructure (actually it's a graph) with one template
parameter (the property P for each edge and vertex):

struct graph<P>;
struct vertex<P>;
struct edge<P>;

I also have an algorithm that modifies this datastructure. The basic
outline of the algorithm is independent of the type of property. So I
implemented a generic version of the algorithm and a function object for
each type of property I need. In this way, adding a new property
involves simply defining the property and implementing the function
object. And that works great, however I have a question about the
function object, which looks more or less like this:

template <typename P>
struct function_object {
// Initialization
void initialize(regi on<P>& r) const;
void initialize(edge <P>& e) const;
// Evaluation
double evaluate(const edge<P>& e) const;
};

As you can see I declared it with a template parameter (and add no
implementation) . For each type of property I add a specialization (with
an implementation of course).

struct my_property;

template <>
struct function_object <my_property{
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

But I could as well have done this without using "function_objec t". Are
there pros and/or contras against this design? Initially, my idea was to
add only a specialization of the member functions only, and not the
whole class, but that doesn't work.
Aug 25 '06 #1
17 2242
Jef Driesen wrote:
Suppose I have a datastructure (actually it's a graph) with one
template parameter (the property P for each edge and vertex):

struct graph<P>;
struct vertex<P>;
struct edge<P>;
You mean, probably

template<class Pstruct graph;
template<class Pstruct vertex;
template<class Pstruct edge;
I also have an algorithm that modifies this datastructure.
You mean, the graph struct (and all related)?
The basic
outline of the algorithm is independent of the type of property. So I
implemented a generic version of the algorithm and a function object
for each type of property I need. In this way, adding a new property
involves simply defining the property and implementing the function
object. And that works great, however I have a question about the
function object, which looks more or less like this:

template <typename P>
struct function_object {
// Initialization
void initialize(regi on<P>& r) const;
void initialize(edge <P>& e) const;
// Evaluation
double evaluate(const edge<P>& e) const;
};

As you can see I declared it with a template parameter (and add no
implementation) . For each type of property I add a specialization
(with an implementation of course).

struct my_property;

template <>
struct function_object <my_property{
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

But I could as well have done this without using "function_objec t".
Are there pros and/or contras against this design? Initially, my idea
was to add only a specialization of the member functions only, and
not the whole class, but that doesn't work.
What doesn't work?

template<>
void
function_object <my_property>:: initialize(regi on<my_property> & r) const
{
// blah
}

See FAQ 5.8.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Aug 25 '06 #2
Jef Driesen wrote:
Suppose I have a datastructure (actually it's a graph) with one template
parameter (the property P for each edge and vertex):

struct graph<P>;
struct vertex<P>;
struct edge<P>;
Not using boost::graph, then.
I also have an algorithm that modifies this datastructure. The basic
outline of the algorithm is independent of the type of property. So I
implemented a generic version of the algorithm and a function object for
each type of property I need.
There is a one-to-one relation between function object and property?
Or are there properties for which you could have multiple function
objects?

I.e. the sort algorithm accepts multiple function objects per type.
I have a question about the function object, which looks like this:

template <typename P>
struct function_object {
// Initialization
void initialize(regi on<P>& r) const;
void initialize(edge <P>& e) const;
// Evaluation
double evaluate(const edge<P>& e) const;
};
Usually initialization is done in the constructor, of course. And
evaluate
is usually named operator(). You might want to inherit from
std::unary_func tion
to make it more STL-compatible.
For each type of property I add a specialization with an implementation.

struct my_property;

template <>
struct function_object <my_property{
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

But I could as well have done this without using "function_objec t". Are
there pros and/or contras against this design?
Pro: you can use function_object <Pas a default parameter to the
algorithm.
cf. std::less<Tfor std::sort.
Contra: it's not compatible with STL or boost::graph.
Initially, my idea was to add only a specialization of the member functions
only, and not the whole class, but that doesn't work.
Simple solution that often works: forward to a free function template,
specialize/
overload that.

HTH,
Michiel Salters

Aug 25 '06 #3
Victor Bazarov wrote:
Jef Driesen wrote:
>Suppose I have a datastructure (actually it's a graph) with one
template parameter (the property P for each edge and vertex):

struct graph<P>;
struct vertex<P>;
struct edge<P>;

You mean, probably

template<class Pstruct graph;
template<class Pstruct vertex;
template<class Pstruct edge;
Of course.
>I also have an algorithm that modifies this datastructure.

You mean, the graph struct (and all related)?
That is correct.
>The basic
outline of the algorithm is independent of the type of property. So I
implemented a generic version of the algorithm and a function object
for each type of property I need. In this way, adding a new property
involves simply defining the property and implementing the function
object. And that works great, however I have a question about the
function object, which looks more or less like this:

template <typename P>
struct function_object {
// Initialization
void initialize(regi on<P>& r) const;
void initialize(edge <P>& e) const;
// Evaluation
double evaluate(const edge<P>& e) const;
};

As you can see I declared it with a template parameter (and add no
implementation ). For each type of property I add a specialization
(with an implementation of course).

struct my_property;

template <>
struct function_object <my_property{
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

But I could as well have done this without using "function_objec t".
Are there pros and/or contras against this design? Initially, my idea
was to add only a specialization of the member functions only, and
not the whole class, but that doesn't work.

What doesn't work?
Providing only implementations for the initialize/evaluate functions
(without a declaring the full class template <struct
function_object <my_propertyabo ve). Because I think that is not allowed
by the C++ language and it will make it impossible to add different
member variables for each type of property.

template <>
struct function_object <my_property1 {
int m_data; // suppose I need ints here
}

template <>
struct function_object <my_property2 {
double m_data; // suppose I need doubles here
}

But that (or writing the code) was not my main problem (because i
already have it working. I was wondering if there is an advantage over
doing something like this:

struct my_function_obj ect {
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

e.g., without using the templated "function_objec t" from my first post?
Aug 25 '06 #4
Jef Driesen wrote:
[..]
But that (or writing the code) was not my main problem (because i
already have it working. I was wondering if there is an advantage over
doing something like this:

struct my_function_obj ect {
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

e.g., without using the templated "function_objec t" from my first
post?
Does 'my_function_ob ject' have any data members (any state)? So far
nothing says that the functions need to be (a) members of a class and
(b) non-static members of that class.

What does 'my_function_ob ject' do?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Aug 25 '06 #5
Victor Bazarov wrote:
Jef Driesen wrote:
>[..]
But that (or writing the code) was not my main problem (because i
already have it working). I was wondering if there is an advantage over
doing something like this:

struct my_function_obj ect {
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

e.g., without using the templated "function_objec t" from my first
post?

Does 'my_function_ob ject' have any data members (any state)? So far
nothing says that the functions need to be (a) members of a class and
(b) non-static members of that class.

What does 'my_function_ob ject' do?
One of the properties is something like this:

struct my_property {
matrix<doubleal pha, mu;
double lambda;
}

The other one has two alpha's and two mu's (for horizontal and vertical
directions).

After constructing the graph, all properties have default values
(default constructor). Simply because the data needed to create the
graph is not the same as the data to calculate the properties, and is
also equal for all kind of properties. Only the algorithm needs those
properties to do its job. That's why I have those two initialize
functions. It also needs to be able to compare two vertices (=edge) and
sort edges. The evaluate function is used for that.

The my_function_obj ect's have several data members. The first one
contains basically one 3D image and the other one two such images.

BTW, in the code from my first post, I mentioned both a vertex and a
region class, but those are the same. In my application a vertex is a
region of image pixels, hence the different name.
Aug 25 '06 #6
"Jef Driesen" <je********@hot mail.com.invali dwrote...
Victor Bazarov wrote:
>Jef Driesen wrote:
>>[..]
But that (or writing the code) was not my main problem (because i
already have it working). I was wondering if there is an advantage over
doing something like this:

struct my_function_obj ect {
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

e.g., without using the templated "function_objec t" from my first
post?

Does 'my_function_ob ject' have any data members (any state)? So far
nothing says that the functions need to be (a) members of a class and
(b) non-static members of that class.

What does 'my_function_ob ject' do?

[..]

The my_function_obj ect's have several data members. The first one contains
basically one 3D image and the other one two such images.

BTW, in the code from my first post, I mentioned both a vertex and a
region class, but those are the same. In my application a vertex is a
region of image pixels, hence the different name.
I am still not convinced that you actually need a class
'my_function_ob ject'.
All you need it for is to calculate something. It doesn't seem to need any
state. You can have separate functions and pass your 3D images to them as
arguments.

If you're struggling with instantiating the function_object thingamajig,
just get rid of it and putt the 'initialize' and 'evaluate' functions out
and make them templates (if necessary, of which I am not convinced either).
Then specialize them, if you need that.

Don't rush to reply. Think about it a bit. It is possible that you have
not provided enough information for me to understand why you need those
functions in a class. It doesn't mean you don't need them in a class, it
just means I don't see it yet. Perhaps you could describe your problem
from a slightly different angle, and it will open up to me (and to you).
So far you have some properties and unrelated algorithms which you want
OOH to unify under a class template and OTOH break apart by specialising.
And hereby lies the problem, methinks.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Aug 25 '06 #7
Mi************* @tomtom.com wrote:
Jef Driesen wrote:
>Suppose I have a datastructure (actually it's a graph) with one template
parameter (the property P for each edge and vertex):

struct graph<P>;
struct vertex<P>;
struct edge<P>;

Not using boost::graph, then.
At some point, I considered using it, but I already had a more or less
working implementation and decided not to rewrite everything using
boost::graph.
>I also have an algorithm that modifies this datastructure. The basic
outline of the algorithm is independent of the type of property. So I
implemented a generic version of the algorithm and a function object for
each type of property I need.

There is a one-to-one relation between function object and property?
Or are there properties for which you could have multiple function
objects?

I.e. the sort algorithm accepts multiple function objects per type.
Each property has its own function object, because they are calculated
from different kind of data.
>I have a question about the function object, which looks like this:

template <typename P>
struct function_object {
// Initialization
void initialize(regi on<P>& r) const;
void initialize(edge <P>& e) const;
// Evaluation
double evaluate(const edge<P>& e) const;
};

Usually initialization is done in the constructor, of course.
The problem is that the graph does not know how to calculate properties.
And I also need the graph itself to calculate the properties. During
construction of the graph (and thus also the regions), I can't calculate
the properties. (I think it can be done if I really want, but I'm afraid
it will be too slow incrementally updating matrices compared to doing it
once in a batch).
And evaluate
is usually named operator(). You might want to inherit from
std::unary_func tion
to make it more STL-compatible.
I also need sorting, and for that I created a simple helper function
object in STL-style.
>For each type of property I add a specialization with an implementation.

struct my_property;

template <>
struct function_object <my_property{
// Initialization
void initialize(regi on<my_property> & r) const;
void initialize(edge <my_property> & e) const;
// Evaluation
double evaluate(const edge<my_propert y>& e) const;
};

But I could as well have done this without using "function_objec t". Are
there pros and/or contras against this design?

Pro: you can use function_object <Pas a default parameter to the
algorithm.
cf. std::less<Tfor std::sort.
Isn't that almost the same as what I have now?

template <typename P>
void apply_algorithm (graph<P>& g, const function_object <P>& p)
Contra: it's not compatible with STL or boost::graph.
Since I'm not using boost::graph, that disadvantage is not so important.
>Initially, my idea was to add only a specialization of the member functions
only, and not the whole class, but that doesn't work.

Simple solution that often works: forward to a free function template,
specialize/
overload that.
I didn't even think about that. But that will not work if the different
function objects need different member variables.
Aug 25 '06 #8
Victor Bazarov wrote:
Jef Driesen wrote...
>[..]

I am still not convinced that you actually need a class
'my_function_ob ject'.
All you need it for is to calculate something. It doesn't seem to need any
state. You can have separate functions and pass your 3D images to them as
arguments.
If I had separate functions, how would my algorithm know about the 3D
images? And also which variant to call, the one with only one 3D image
as parameter, or the one with two 3D images? With 'my_function_ob ject',
I can add them as member variables and have a version which takes one 3D
image in the constructor and one with two 3D images. And then pass the
function object (which knows how to do the calculations and has all the
extra data) and the graph (which knows the layout of the regions and its
pixels) to my algorithm (where everything is glued together).
If you're struggling with instantiating the function_object thingamajig,
just get rid of it and putt the 'initialize' and 'evaluate' functions out
and make them templates (if necessary, of which I am not convinced either).
Then specialize them, if you need that.

Don't rush to reply. Think about it a bit. It is possible that you have
not provided enough information for me to understand why you need those
functions in a class. It doesn't mean you don't need them in a class, it
just means I don't see it yet. Perhaps you could describe your problem
from a slightly different angle, and it will open up to me (and to you).
So far you have some properties and unrelated algorithms which you want
OOH to unify under a class template and OTOH break apart by specialising.
And hereby lies the problem, methinks.
I will try to reformulate what I'm trying to do.

First step is the constructing of the graph datastructure. The graph is
created from a 2D image, where each pixel is a label. A vertex in the
graph represent a group of pixels with the same label (e.g. a region).
An edge represents a link between two such regions, adjacent to each
other (e.g. neighbors).

Second step is my algorithm. First, all properties for the regions are
calculated. A property for a region is calculated from the corresponding
pixels of one or two 3D images (depending on the type of property)
inside that region. The property itself is some statistical data, like
average vector and covariance matrix. When that is ready, the properties
are calculated for all edges. Properties for an edge are simply the same
statistical properties, but for the union of both regions. They can be
calculated from the properties of the two regions directly (if
possible), or from the underlying 3D image data again. After that edges
are evaluated against a threshold and suitable edges are selected and
sorted according to the return value of the evaluate function. Finally,
the graph is modified and properties are updated again.
Aug 25 '06 #9
Jef Driesen wrote:
Victor Bazarov wrote:
>Jef Driesen wrote...
>>[..]

I am still not convinced that you actually need a class
'my_function_o bject'.
All you need it for is to calculate something. It doesn't seem to
need any state. You can have separate functions and pass your 3D
images to them as arguments.

If I had separate functions, how would my algorithm know about the 3D
images?
But you don't have a single algorithm, do you? One uses one image, the
other one uses two. So, you need two separate functions, one with one
extra argument of type 'my3Dimage const&', the other needs two extra
arguments.
And also which variant to call, the one with only one 3D image
as parameter, or the one with two 3D images?
Shouldn't the caller know that? You are going to stuff them into your
'function_objec t' somehow, so at some point the code needs to know how
many images to pass and to whom...
With
'my_function_ob ject', I can add them as member variables and have a
version which takes one 3D image in the constructor and one with two
3D images.
Yes, just like you can have two separate function_object classes. Just
like you can have no classes whatsoever. The code that creates the
objects (right now) can just as well call the 'initialize' functions
without the object, can't it?
And then pass the function object (which knows how to do
the calculations and has all the extra data) and the graph (which
knows the layout of the regions and its pixels) to my algorithm
(where everything is glued together).
Again, it's not a single algorithm, is it? At least so far I've not
see a single algorithm. And if it is a single algorithm, then you are
much better off actually employing polymorphism, IOW, having both of
your 'function_objec ts' derive from an abstract class and override
your 'initialize' and 'evaluate' functions... Since you've not shown
how your 'my_function_ob ject' instance is going to be used, I have
not formed any opinion on the matter except that it sounds unneededly
complicated.
>If you're struggling with instantiating the function_object
thingamajig, just get rid of it and putt the 'initialize' and
'evaluate' functions out and make them templates (if necessary, of
which I am not convinced either). Then specialize them, if you need
that. Don't rush to reply. Think about it a bit. It is possible that
you
have not provided enough information for me to understand why you
need those functions in a class. It doesn't mean you don't need
them in a class, it just means I don't see it yet. Perhaps you
could describe your problem from a slightly different angle, and it
will open up to me (and to you). So far you have some properties and
unrelated algorithms which you want OOH to unify under a class
template and OTOH break apart by specialising. And hereby lies the
problem, methinks.

I will try to reformulate what I'm trying to do.

First step is the constructing of the graph datastructure. The graph
is created from a 2D image, where each pixel is a label. A vertex in
the graph represent a group of pixels with the same label (e.g. a
region). An edge represents a link between two such regions, adjacent
to each other (e.g. neighbors).
That looks like you need a function like

template<class Pgraph<PcreateG raph(my2Dimage const&);

where 'graph' would contain the vertices and edges necessary to define
your topology. No need for a special functor as of yet.
Second step is my algorithm. First, all properties for the regions are
calculated. A property for a region is calculated from the
corresponding pixels of one or two 3D images (depending on the type
of property) inside that region. The property itself is some
statistical data, like average vector and covariance matrix. When
that is ready, the properties are calculated for all edges.
Properties for an edge are simply the same statistical properties,
but for the union of both regions. They can be calculated from the
properties of the two regions directly (if possible), or from the
underlying 3D image data again. After that edges are evaluated
against a threshold and suitable edges are selected and sorted
according to the return value of the evaluate function. Finally, the
graph is modified and properties are updated again.
Uh... I am not seeing it...

template<class P>
void calculateProper ties(region<P>& , my3Dimage const*);

template<class P>
void calculateProper ties(edge<P>&, my3Dimage const*);

template<class P>
void calculateProper ties(graph<P>&, my3Dimage const*);

The pointer is either one image, or two images or as many as you like,
put into an array. Or you can have a pointer to pointer, which could
be an array of pointers to image...

Where is the need for a 'function_objec t'?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Aug 25 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
10059
by: christopher vogt | last post by:
Hi, i'm wondering if there is something like $this-> to call a method inside another method of the same class without using the classname in front. I actually use class TEST { function func1()
3
2701
by: George Sakkis | last post by:
I'm trying to write a decorator similar to property, with the difference that it applies to the defining class (and its subclasses) instead of its instances. This would provide, among others, a way to define the equivalent of class-level constants: class Foo(object): @classproperty def TheAnswer(cls): return "The Answer according to %s is 42" % cls.__name__
4
2170
by: Chuck Ritzke | last post by:
I keep asking myself this question as I write class modules. What's the best/smartest/most efficient way to send a large object back and forth to a class module? For example, say I have a data access module that creates a large disconnected dataset from a database. I want to pass that dataset back to the calling program. And then perhaps I want to send that dataset to another class module. At first it seems that the "object oriented"...
6
2553
by: gustav04 | last post by:
hi all i have a question: what is the difference between a c-function and an c++ class method (both do exactly the same thing). lets say, i have a function called print2std() and a class called CUtils with a static method called print2std()
1
3536
by: Jing You | last post by:
hi every one, I have got some confused problem when I try to write some custom object by javascript. Look at the example code here: <BODY> <script language="jscript">
1
4737
by: dave | last post by:
I'm classic ASP developer and trying to switch to .net ...I'm newbie to ..net... In classic ASP for ADO connectivity i used to put below code in one separate file and used to include that file whereever I need database opreation... Dim objDatabase Set objDatabase = Nothing '-- Singleton for the CDatabase class Function Database If objDatabase Is Nothing Then Set objDatabase = New CDatabase End If
6
3959
by: Max | last post by:
Last time I tried to explain this on another forum it didn't go too well, so I'll try my best and if you know what I'm talking about then please tell me how to do this. I have a class, inside I have some public functions and private variables. Inside the class I also have a declaration of a new form object. One of the functions of the class takes that form object, shows it with showdialog and the basically passes the control to the form...
16
3108
by: Java script Dude | last post by:
Creating a method of object (Object.prototype.classOf ...) is not the correct way because of a (as expected) flaw in IE where DOM Elements does not inherit from Object. As a result it is best to create a stand alone method passing the object as an argument: ~~~~ CODE ~~~~ <div id=divTest></div>
6
3218
by: Xu, Qian | last post by:
Hello All, is there any handy tool to generate class diagrams for javascript? I have tried JS/UML, but it generates always an empty diagram. -- Xu, Qian (stanleyxu) http://stanleyxu2005.blogspot.com
25
2808
by: Jeremy Banks | last post by:
Hi. I wondered if anyone knew the rationale behind the naming of the Popen class in the subprocess module. Popen sounds like the a suitable name for a function that created a subprocess, but the object itself is a subprocess, not a "popen". It seems that it would be more accurate to just name the class Subprocess, can anyone explain why this is not the case? Thank you.
0
9789
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11129
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10734
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10838
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
1
7967
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5794
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5988
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4607
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4213
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.