简体   繁体   English

输入类型 arguments 取决于模板 boolean

[英]type of input arguments depending on template boolean

My purpose is simple, data type of the input is depending on the template bool:我的目的很简单,输入的数据类型取决于模板 bool:

template<bool isfloa>
class example{
public:
  if (isfloa){
    example(float p){printf("sizeof p: %d\n", sizeof(p))};
  } else{
    example(uint64_t p){printf("sizeof p: %d\n", sizeof(p))};
  }
};

This cannot pass the compliation and I have the following solution (haven't test it):这无法通过编译,我有以下解决方案(尚未测试):

using dataType = isfloa ? float : uint64_t;
example(dataType p){printf("sizeof p: %d\n", sizeof(p))};

I'd like to know if this works?我想知道这是否有效? And are there any other solutions?还有其他解决方案吗? Thanks a lot.非常感谢。

You can use std::conditional您可以使用std::conditional

template<bool isfloat>
class example{
public:
    using value_type = std::conditional_t<isfloat,float,int>;
    example(value_type p){printf("sizeof p: %d\n", sizeof(p));}
};

In C++17 you can use sfinae to disable or enable member functions:在 C++17 中,您可以使用 sfinae 禁用或启用成员函数:

template<bool isfloa>
class example{
public:
    template<bool isf = isfloa, std::enable_if_t<isf, int> = 0>
    example(float p){ printf("sizeof p: %d\n", sizeof(p)); }

    template<bool isf = isfloa, std::enable_if_t<!isf, int> = 0>
    example(uint64_t p){ printf("sizeof p: %d\n", sizeof(p)); }
  }
};

In C++20 you can simply use the requires keyword:在 C++20 中,您可以简单地使用requires关键字:

template<bool isfloa>
class example{
public:
    example(float p) requires(isfloa)
    { printf("sizeof p: %d\n", sizeof(p)); }

    example(uint64_t p) requires(!isfloa)
    { printf("sizeof p: %d\n", sizeof(p)); }
  }
};

Prefer using normal overloading of functions, then after that switch to templates where needed.更喜欢使用正常的函数重载,然后在需要的地方切换到模板。 In this case reuse of the same code for both floating point types.在这种情况下,为两种浮点类型重用相同的代码。

#include <type_traits> // header file for all kinds of type related checks at compile time
#include <iostream>

// for std::uint64_t only just use standard overloading 
// NO need to overuse templates and template specializations where none is needed.
void example(const std::uint64_t value)
{
    std::cout << "std::uint64_t, value = " << value << "\n";
}

// use SFINAE (std::enable_if_t) to enable this version of the function only for floating point types
template<typename type_t>
static inline std::enable_if_t<std::is_floating_point_v<type_t>, void> example(const type_t& value)
{
    std::cout << "floating point value, value = " << value << "\n";
}

int main()
{
    double fp{ 3.14159265 };
    example(fp);

    std::uint64_t value{ 42 };
    example(value);

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM