class方法的内容由模板值决定
Content of class method determined by the template value
通过使用 c++ 14 或 c++11,我们是否有一种优雅的方法来完成以下任务?成员数量和操作类型由模板输入值决定'count'
template<int count>
class show{
public:
run(){
if (count == 1){
int x;
} else if(count ==2){
int x, y;
}else if(count ==3){
int x, y, z;
}
if (count == 1){
printf("res: %d \n", x);
} else if(count ==2){
printf("res: %d \n", x+y);
}else if(count ==3){
printf("res: %d \n", x+y+z);
}
}
};
更新:在这种情况下我们可以使用部分专业化或与模板相关的东西吗?
在你的情况下,数组 (std::array
) 似乎是合适的:
template <std::size_t count>
class show
{
public:
std::array<int, count> data{};
// ...
void run()
{
const int sum = std::accumulate(data.begin(), data.end(), 0);
printf("res: %d \n", sum);
}
};
是的,你可以使用专业化:
template<int count>
class show;
template<>
class show<1>{
int x;
public:
show(int _x):x{_x}{}
void run(){
std::cout << "val of x " << x << std::endl;
}
};
template<>
class show<2>{
int x,y;
public:
show(int _x, int _y):x{_x}, y{_y}{}
void run(){
std::cout << "add " << x+y << std::endl;
}
};
但你也可以让它更通用:
template <int count>
class simply
{
std::array<int, count> arr;
public:
template < typename ... T >
simply( T ... in ): arr{ in... } {}
void run()
{
std::cout << [this](){ int sum=0; for( auto el: arr ){ sum+=el; } return sum; }() << std::endl;
}
};
要使用以上所有内容:
int main() {
show<1> s1(10);
show<2> s2(100,200);
s1.run();
s2.run();
simply<4> si( 1,2,3,4 );
si.run();
}
备注:
您应该向 simply
添加更多内容以检查所有类型为 int 的参数是否具有 sfinae 或 static_assert
。但他的是另一个问题...
通过使用 c++ 14 或 c++11,我们是否有一种优雅的方法来完成以下任务?成员数量和操作类型由模板输入值决定'count'
template<int count>
class show{
public:
run(){
if (count == 1){
int x;
} else if(count ==2){
int x, y;
}else if(count ==3){
int x, y, z;
}
if (count == 1){
printf("res: %d \n", x);
} else if(count ==2){
printf("res: %d \n", x+y);
}else if(count ==3){
printf("res: %d \n", x+y+z);
}
}
};
更新:在这种情况下我们可以使用部分专业化或与模板相关的东西吗?
在你的情况下,数组 (std::array
) 似乎是合适的:
template <std::size_t count>
class show
{
public:
std::array<int, count> data{};
// ...
void run()
{
const int sum = std::accumulate(data.begin(), data.end(), 0);
printf("res: %d \n", sum);
}
};
是的,你可以使用专业化:
template<int count>
class show;
template<>
class show<1>{
int x;
public:
show(int _x):x{_x}{}
void run(){
std::cout << "val of x " << x << std::endl;
}
};
template<>
class show<2>{
int x,y;
public:
show(int _x, int _y):x{_x}, y{_y}{}
void run(){
std::cout << "add " << x+y << std::endl;
}
};
但你也可以让它更通用:
template <int count>
class simply
{
std::array<int, count> arr;
public:
template < typename ... T >
simply( T ... in ): arr{ in... } {}
void run()
{
std::cout << [this](){ int sum=0; for( auto el: arr ){ sum+=el; } return sum; }() << std::endl;
}
};
要使用以上所有内容:
int main() {
show<1> s1(10);
show<2> s2(100,200);
s1.run();
s2.run();
simply<4> si( 1,2,3,4 );
si.run();
}
备注:
您应该向 simply
添加更多内容以检查所有类型为 int 的参数是否具有 sfinae 或 static_assert
。但他的是另一个问题...