C++ :: Variadic Template Function Parameters And Method Pointers?
Oct 24, 2013
I have been experimenting with variadic templates with the aim of caching a call to a class method by storing away the object pointer, method pointer and parameters. I've actually had some reasonable success but have now hit a stumbling block. I now wish to wrap my parameters in a simple template class when I cache them. My success is as follows:
Using variadic template functions to store these pointers and paremeters;
I'm able to pass a method pointer and unwrapped parametersI'm able to pass wrapped parameters on their own.I'm NOT able to pass a method pointer and wrapped parameters I set up a little prototype project to demonstrate the issue and added comments above the function calls to indicate the compilation results. Here is the code:
Code:
#include "stdafx.h"
//////////////////////////////////////////////////
// Basic class with a simple method
//////////////////////////////////////////////////
class MyClass {
public:
char Method( int i, float f ) {
return 'A';
[code]....
But I'm convinced it should take three arguments, the method pointer and two wrapped parameters. Visual studio even suggested it should as shown below:
I noticed that when using variadic functions, if I pass the va_arg() as parameter to a function, the parameters get passed in reverse. Is that expected?
For example, the following code outputs Code: 1 2 2 1
I'm having some problems in understanding how the code below works and why it produces the output it produces.. What I'd expect is that both functions, namely `add_1' and `add_2', would print the same output; but I've been proven wrong :/ So why does the second one get different memory addresses for the same variable?
Code should be self-explaining:
Code: template<typename... Types> void add_1(Types&&... values) { // by the way: why do i have to use `const int' instead of `int'? std::vector<std::reference_wrapper<const int>> vector{ std::forward<Types>(values)...}; std::cout << "add_1:" << std::endl; for (const auto& value:vector) { std::cout << &value.get() << std::endl;
test.cpp: In function ‘int main()’: test.cpp:20:30: error: no matching function for call to ‘func1(std::vector<int>&)’ test.cpp:20:30: note: candidate is: test.cpp:8:45: note: template<class T, class U> std::map<T, T> func1(U) test.cpp:8:45: note: template argument deduction/substitution failed: test.cpp:20:30: note: couldn't deduce template parameter ‘T’
I had to learn how to use variadic templates recently, and had trouble finding simple examples that just showed the basic syntax.
So I decided to write one myself. Admittedly, it's a bit on the long side, but that is mostly because it includes five specializations.
insert Code: // Variadic.C // Compile command: g++ Variadic.C -std=c++0x // I used GCC version 4.6.3 on Ubuntu.
// This file contains a basic variadic template with five specializations. // It is intended for non-software engineers who are looking for a simple // example of variadic template syntax.
I wonder if it is possible to remove the last argument in an argument pack? Below is an example on what I want to accomplish:
template<template<int...> class A,int... Ints> A<remove_last_int<Ints...>::list> func(const A<Ints...> & a0) { A<remove_last_int<Ints...>::list> a; ... //Here a set the members of a based on a0. ... return a; }
For example, I want the return a A<1,2> value from (const A<1,2,3> & a0)
that successfully allows me to enable the function foo() only if FIRST is convertible to Base*, but I also only want foo() enabled if each type in REST... meets the same condition. What is the syntax for that? If no such syntax exists, how to achieve that effect?
#include "tensor.h" int main() { Tensor<2,-2> m = {{1,2},{1,3}}; Tensor<2> v = {1,5}; std::cout<<m*v<<"
[Code] ....
Why do I get an ambiguity and why is not the wanted operator*-overload (the last one in the tensor.h file) not even mentioned as one of the candidates? Is it clear what I want to do? And if so, what can I do to make the call unambiguous?
I am wanting to separate the logic from the visual, but I'm having problems when calling the method that controls the actions of the progress bar timer.
Error1error C2182: 'set_Progress' : illegal use of type 'void'h:cry_devprogrammingc++school_mediaschool_mediaForm1.h277 Error2error C2078: too many initializersh:cry_devprogrammingc++school_mediaschool_mediaForm1.h277 Error3error C2440: 'initializing' : cannot convert from 'System::Windows::Forms::Timer ^' to 'int'h:cry_devprogrammingc++school_mediaschool_mediaForm1.h277
how to use template parameters to perform arithmetic operations on objects.
I feel that it would best to demonstrate my issue rather than try and explain it.
Sample:
// Fundamental object structure template<int T> struct myInt { myInt() { value = T; };
[Code]....
What I don't know is how to get a hold of the T variable to add them through the 'add' structure. Also, might any of this have to do with sequence wrappers?
seq_c<T,c1,c2,... cn> is essentially what I'm thinking of. Where T in this case is the type and c to the nth c are the values.
#include <string> #include <vector> using namespace std; class Question { string title; vector<Thing*> posAns; vector<Thing*> negAns;
[Code] ....
error: no instance of overloaded function 'std::vector::push_back()' matches the arguments list argument types are (const Thing *) object type is: std:: vector<Thing *, std::allocator<Thing *>>
So it cannot be constant, what if I just leave it non-constant? Will it be safe?
In here, T can be from the class CMesh * or CSkinnedMesh *, both have signature of GetAnimController
This maybe a flaw in my design... But I want Create to accept any kinds of meshes.
Should I create an interface or abstract class above all of those?
I have added an IMesh class that every derived classes has to have the needed interface.
But since then, I have another question, I feel that it is very cumbersome to include a template argument in every class/prototype that is associated with CObject
Say bool CreatePlanesFromObject(CObject *pObject, D3DXPLANE *pPlanes); Requires me to do this template<class T> bool CreatePlanesFromObject(CObject<T>* pObject, D3DXPLANE* pPlanes);
Any ways I can omit the template argument, because it doesn't make sense to know the Mesh type in other classes...
I'm doing right now is creating a function that callocs (I prefer this to malloc) and returns a string, and it will work similar to printf, I'm calling the function alloCpy(),I have several values that I need in a malloced string, so I call Code: myAllocedString = alloCpy("Value 1 is %s, value 2 is %s, and value 3 is %d", str1, str2, num); To do this I'm using the Variadic Macro, the reason I'm not just using a Variadic Function such as this: Code: char* alloCpy(char *format, ...) {} is because I need to append NULL to the end for the sake of looping through arguments, and I'm understanding it thusfar, but I have a few issues, first of all, I tried defining the Macro in a header file, but when I try to call it I get the error "Undefined reference to alloCpy". Also, to loop through arguments to get string lengths I'm using va_arg(args, char*) which requires all the arguments to be of type char*. Here is my code: myheader.h:
So, how can I do this to, first of all, make my macro function accessible from other files importing myheader.h, and second, how can I make it accept any type of argument like printf, so that my example above would work?
i've tried to create a method to return a rectangle struct, the class already has a object of this structure, but when i try return the variable(not a pointer), i receive a SIGSEGV and i dont know why, i dont acces invalid memory addresses:
Code: Retangulo Crature::GetRect() { return rect;
[Code]....
the pointer for the player is passed to the class through a method, but i'm sure(testing with the debugger) the player is working and his memory address is valid.
I'm looking for a way to enter an unlimited amount of types in the <> part of a template function, I found Variadic templates but I'm not sure if it can do it, all the examples I've found are similar to the C argument list and don't use the <> part of the template at all.
I'm trying to implement a simple template array class, but when i came into the operator< i actually have to use a template :
my code is something like :
template<typename _Type, std::size_t _Size> class array { public :
[Code] ......
but i am having an error of shadows template param 'class _Type' is it w/ the name conflict between the array template parameter and the function template parameter ?
where 'g()' returns an object of the element type. However, the compiler is claiming, no matter how I write a call to the overload, the original template is selected and/or the overload is invalid, depending on the various ways I attempt to write said overload.
In my program I created three separate return functions. Each function is labeled:
int boxes(int x, int y); int leftOver(int x, int y); double avgItemsShipped(int x, int y, int z);
Is it bad programming practice to use 'x' and 'y' in all of my functions? Should I use the this keyword inside the function? We use this often in my Java class and I know it exists in C++, but I haven't actually seen it used (or used it myself yet).