Untuk pertanyaan pertama:
Saya ingin menulis fungsi untuk menggabungkan string, dan dapat menerima banyak string;
#include <string>
#include <vector>
#include <type_traits>
template <class... Args, typename std::enable_if<std::is_same<typename std::decay<Args...>::type, std::string>::type>::type>
std::string foo(const std::string &first, const Args &... senconds) {
std::string delimiter = "$$";
std::string ret = first;
std::vector<std::string> vec{senconds...};
for (auto second = vec.rbegin(); second != vec.rend(); second++) {
ret = delimiter + *second + delimiter + ret;
}
return ret;
}
tetapi ketika saya memintanya seperti:
std::string name = "x";
name = foo(name, "xxx");
kompiler akan membuat kesalahan:
error: no matching function for call to ‘foo(std::__cxx11::string&, const char [4])’
dan akan ada beberapa catatan:
note: couldn't deduce template parameter ‘<anonymous>’
Saya rasa saya harus mengubah batasan dalam templat, dan saya telah mencoba semua metode terkait di type_traits
, tetapi tidak ada satupun yang berhasil.
Untuk pertanyaan kedua:
Saya ingin menyembunyikan implementasi beberapa fungsi, tetapi untuk fungsi templat, ia tidak dapat memasukkan definisi ke dalam .hpp
, dan memasukkan implementasi ke dalam .cpp
, kompiler akan memunculkan kesalahan undefined reference
. Apakah ada cara elegan untuk mengatasi ini?
Terima kasih.
Args...
menjadistd::string
, hanya sesuatu yang dapat Anda contohkanstd::string
- person Caleth   schedule 28.11.2019