Novo curso! Todo programador deveria aprender IA generativa!
Experimente uma aula grƔtis+ 2
Template type from return
Hi Refer code below: I am ok with set function. It has parameter T which help me decide whether function is called for int or not. How to do same for get which don't have input paramter. It has only return type. How to call this get method from main ? Calling It currently results into error. How to solve this? In short : how to avoid error even if last two lines of main functions are not commented.? https://sololearn.com/compiler-playground/cBNFA2qnYPyJ/?ref=app
10 Respostas
+ 4
Debug:
#include <iostream>
using namespace std;
class Test
{
private:
int intArg;
double dblArg;
char chrArg;
public:
template<class T> T get(){
cout << "Getter called for ";
if(is_same<T,int>::value)
return intArg;
else if(is_same<T,double>::value)
return dblArg;
else
return chrArg;
}
template<class T> void set(T t){
cout << "Setter called for ";
if(is_same<T,int>::value)
cout << "int\n",
intArg = t;
else if(is_same<T,double>::value)
cout << "double\n",
dblArg = t;
else
cout << "char\n",
chrArg = t;
}
};
int main(){
Test obj;
obj.set(1);
obj.set(2.3);
obj.set('a');
cout<<endl<<obj.get<int>()
<<endl<<obj.get<double>()
<<endl<<obj.get<char>();
return 0;
}
+ 2
but your setter did not really set anything that the getter can access... you only inferred the type and displayed a message.
Notice that the get() is not really returning any value. That is the problem. What should the return type be?
The hard part is the type of the variable the setter and getter are passing around. C++ types are rigid and variant types are hard to work with.
+ 2
His solution is best for traditional getter and setter. I don't need to save any data or state to class
+ 2
Solo
I saved a copy of your code for personal reference in the future . It is a great alternative to variant, any, etc. Why try to put multiple data types into one variable when it is possible to work with them separately. Your code is a simpler solution.
Ketan Lalcheta, good to know you got the real code sorted out. But I agree with Solo, calling it a setter if it does not set anything is confusing. Setters and getters usually work together to access private variables. My feeling is that you actually just need to set a flag to indicate whether the value is an integer or a double.
But yeah, all's well that ends well..
+ 1
Ketan Lalcheta I hope you understand that your second version of the code is just a demonstration of the output of a real value that is stored in the getter, while the setter does not carry any useful function at all, so it can simply be delete.
0
Thanks a lot Bob_Li
I did a basic mistake of not returning anything from a function having non void return type.
I don't want my set function to store anything. Basically this set will be delegating call to QT spin box based on int or double.
I solved as below :
https://sololearn.com/compiler-playground/cpVz9D6CioHN/?ref=app
0
Ketan Lalcheta
Solo 's solution seems to be the more useful implementation. The setter and getter are actually setting and getting values.
perhaps the best answer checkmark should be moved there?
0
Bob_Li thank you so much for evaluating my version of this code.
I don't pretend to be the best answer, I just wanted to supplement your answer with code that has practical application in my opinion...š
The code turned out to be too big to fit in the answer, so I squeezed it slightly, but still not enough to write a comment on it, and there's not much to add to your answer, in my opinion everything is already visible from the code.
0
Solo , let me reiterate. I never wanted to set or get any value stored in class object.
This is sample code and not the exact production code.
Current class is simple class wrapper which will pass details to QT implementation.
My whole concern was to make this class wrapper work for int and double and I should be able to differentiate int or double in both getter and setter.
I was observing crash in initial code as I was not returning anything from getter earlier
0
Ketan Lalcheta š...šš³