C++ 如何编写一个函数,该函数接受任何std::chrono::duration(1ms、4s、7h)并以浮点形式获取秒数?

C++ 如何编写一个函数,该函数接受任何std::chrono::duration(1ms、4s、7h)并以浮点形式获取秒数?,c++,chrono,C++,Chrono,即使只是尝试开始,我也会遇到以下代码错误: note: candidate template ignored: could not match 'double' against 'long' :: #包括 #包括 使用名称空间std::chrono_文本; //如何编写一个需要任意持续时间的函数并将其打开 //转换为秒的浮点表示形式? 模板 无效go(标准::计时::持续时间d){ //我想做什么(这可能不起作用,因为我还没走到这一步): 浮动秒数=std::chrono::持续时间(d);

即使只是尝试开始,我也会遇到以下代码错误:

note: candidate template ignored: could not match 'double' against 'long'
::

#包括
#包括
使用名称空间std::chrono_文本;
//如何编写一个需要任意持续时间的函数并将其打开
//转换为秒的浮点表示形式?
模板
无效go(标准::计时::持续时间d){
//我想做什么(这可能不起作用,因为我还没走到这一步):
浮动秒数=std::chrono::持续时间(d);
}
int main()
{
go(1ms);
go(1s);
}
模板浮动秒数(常数持续时间\u t&d);
模板
浮动秒数(常数标准::计时::持续时间和d)
{
typedef std::chrono::duration duration\u t;
自动1秒=std::chrono::duration\u cast
(std::chrono::seconds(1)).count();
如果(1秒==0)
返回d.count()*
标准::计时::持续时间
(duration_t(1)).count();
其他的
返回浮点(d.count())/1秒;
}

我只能猜测你想要完成什么,以下是我最好的猜测:

#include <chrono>
#include <iostream>
using namespace std::chrono_literals;

void go(std::chrono::duration<float> d) {
    std::cout << d.count() << '\n';
}

int main()
{
  go(1ms);
  go(1s);
}

转换为浮点和调用计数():

#包括
#包括
#包括
模板
浮动到秒(标准时间持续时间T)
{
标准时间持续时间f=t;
返回f.count();
}
int main(int argc,char*argv[])
{

std::cout
count
的名称似乎不太合适。:)我有一个函数,可以在超时时创建,只想说。超时(1ms)或超时(1min)。我不知道你可以只接受它作为一个持续时间。这让事情变得更好,不必使用模板。为什么这样做:当不是持续时间的
持续时间
传递到
go()时
,编译器尝试使用
duration
的转换构造函数将
duration
转换为
duration
。其中一个
duration
的转换构造函数被模板化,以接受任何类型的duration。这用于将
duration
转换为
duration
,然后一切都作为e预期的。我不明白为什么你必须模板化第一个参数,而不是只说
float
——特别是考虑到下面霍华德的解决方案是如何工作的。我没有完全遵循你正在采取的所有步骤——这是其他解决方案(特别是霍华德的)没有考虑的原因吗?
template<typename duration_t> float seconds(const duration_t &d);

template<class Rep, class Period>
float seconds(const std::chrono::duration<Rep, Period> &d)
{
    typedef std::chrono::duration<Rep, Period> duration_t;

    auto one_second=std::chrono::duration_cast<duration_t>
                  (std::chrono::seconds(1)).count();

    if (one_second == 0)
        return d.count() *
          std::chrono::duration_cast<std::chrono::seconds>
                (duration_t(1)).count();
    else
        return float(d.count())/one_second;
}
#include <chrono>
#include <iostream>
using namespace std::chrono_literals;

void go(std::chrono::duration<float> d) {
    std::cout << d.count() << '\n';
}

int main()
{
  go(1ms);
  go(1s);
}
0.001
1
#include <iostream>
#include <numeric>
#include <chrono>

template< class T, class P >
float to_secs(std::chrono::duration< T, P > t)
{
    std::chrono::duration< float > f = t;
    return f.count();
}

int main(int argc, char*argv[])
{
    std::cout << to_secs(std::chrono::milliseconds(1)) << std::endl;
    std::cout << to_secs(std::chrono::minutes(1)) << std::endl; 
    std::cout << to_secs(std::chrono::hours(1)) << std::endl;
    // output:
    // 0.001
    // 60
    // 3600
    return 0;
}